编译器拒绝此代码段
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?
答案 0 :(得分:2)
Init方法具有所有参数的外部名称。这有助于迅速与可可的兼容性。对于大多数方法,第一个参数名称是函数名称的一部分,因此它没有外部名称。由于init方法只使用函数名的类名,因此必须在某处显示外部名称。
例如,objective-c init看起来像这样:
[[NSString alloc] initWithBytes:nil length:0 encoding:NSASCIIStringEncoding];
为了显示第一个参数是swift中的字节,它使用外部名称。
NSString(bytes: nil, length: 0, encoding: NSASCIIStringEncoding)