gpt4 book ai didi

objective-c - @objc 对 Swift 3 的要求?

转载 作者:行者123 更新时间:2023-11-28 11:00:47 25 4
gpt4 key购买 nike

知道为什么我的 Swift 3 iOS 应用程序是这个

@objc(mapView:rendererForOverlay:) func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {

触发器,但是如果我用这个替换上面的语句

func mapView(mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {

不触发。

最佳答案

连马特的回答都是正确的我想解释下划线的原因。

为什么需要下划线?

简短回答:因为这是方法的声明:

 optional func mapView(_ mapView: MKMapView, 
rendererFor overlay: MKOverlay) -> MKOverlayRenderer

https://developer.apple.com/reference/mapkit/mkmapviewdelegate/1452203-mapview

长答案:

tl;dr:您需要它来删除 Swift 3.0 中第一个参数的前导参数名称。

要了解您必须了解整个故事:

Objective-C 具有类似的命名参数:整个方法声明(包括参数声明之前的部分)是方法标识符的一部分。有了方法……:

- (MKOverlayRenderer *)mapView:(MKMapView *)mapView 
rendererForOverlay:(id<MKOverlay>)overlay;

… 这意味着方法(选择器)的标识符是 mapView:renderForOverlay:。这个系统很简单,而且使用了很长时间。它很强大,因为它使方法重载成为不必要的。

根据 Swift 的设计原则,为了将工作和简单的事情变得复杂到无法说出它们是否工作,他们做了一些棘手的 hack:

Swift 具有类似的从 Objective-C 选择器到 Swift 函数和参数标识符的转换机制。他们在 Swift 1.2(?) 中找到了一个很好的解决方案,这让事情变得更容易了。后来他们意识到,这个伟大而简单的解决方案令人困惑,他们在 Swift 2.0 中提供了一个新的解决方案,它迄今为止更强大、更简单。后来他们意识到,更大更简单的解决方案令人困惑,他们在 Swift 3.0 中提供了一个全新的解决方案,这是迄今为止更大的解决方案。

虽然在 Swift < 3.0 中,第一个(外部)参数名称默认为空(因为选择器的第一部分成为函数名称),但此规则不再适用,您必须指定它。下划线只是表示没有外部名称。因此,您的方法名称已正确翻译为 Objective-C 的选择器。

它采用函数名mapView,因为_没有添加外部名称,所以它是mapView:。然后它添加下一个外部参数名称renderFor,这导致mapView:renderFor,然后是参数名称overlay,将其大写为Overlay,这导致 mapView:renderForOverlay: – 正确的选择器。

很简单,很简单。另一个使 Swift 中的事情变得又好又简单的特性。在 Objective-C 中更容易

关于objective-c - @objc 对 Swift 3 的要求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40636575/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com