指定non时,需要编译器坚持使用外部参数标签

时间:2014-08-06 21:52:48

标签: swift

编译器拒绝此代码段

func setCoordinate(theCoordinate: CLLocationCoordinate2D)  {
    class MapPin : NSObject, MKAnnotation {
        var coordinate: CLLocationCoordinate2D
        init(x: CLLocationCoordinate2D) {
            self.coordinate = x
        }
    }

    let pin = MapPin(theCoordinate)

它表示缺少标签,正确的语法应为:

let pin = MapPin(x: theCoordinate)

但是init方法没有声明外部参数名称,那么为什么编译器说有问题呢?即我认为代码必须使用外部标签:

func setCoordinate(theCoordinate: CLLocationCoordinate2D)  {
    println("cheese \(theCoordinate.longitude) \(theCoordinate.latitude)")
    class MapPin : NSObject, MKAnnotation {
        var coordinate: CLLocationCoordinate2D
        init(theExternalLabel theInternalName: CLLocationCoordinate2D) {
            self.coordinate = theInternalName
        }
    }

    let pin = MapPin(theExternalLabel: theCoordinate)

那么为什么编译器坚持在第一个代码片段中调用函数时必须使用x:label?

1 个答案:

答案 0 :(得分:2)

Init方法具有所有参数的外部名称。这有助于迅速与可可的兼容性。对于大多数方法,第一个参数名称是函数名称的一部分,因此它没有外部名称。由于init方法只使用函数名的类名,因此必须在某处显示外部名称。

例如,objective-c init看起来像这样:

[[NSString alloc] initWithBytes:nil length:0 encoding:NSASCIIStringEncoding];

为了显示第一个参数是swift中的字节,它使用外部名称。

NSString(bytes: nil, length: 0, encoding: NSASCIIStringEncoding)