标签:
由于Apple官方的《The Swift Programming Guide》对Swift编程语言中的方法引用介绍得不多,所以这里将更深入、详细地介绍Swift中的方法引用。
Swift与Objective-C不同,由于Objective-C的方法都属于“消息”,因此直接用selector的消息签名即可表示一条确定的消息作为方法引用。而Swift的方法更类似于C++、Java中的方法,也就是说比Objective-C更静态,因此它不具有如此般灵活性。
另外,在Swift编程语言中,方法引用与C++中的不同,而与Java的类似,是要与当前对象绑定在一起的。如果方法引用所指向的某个类的方法,该方法没有被重载,那么可直接使用 对象名 . 方法名 的方式来表示。如果方法有被重载,那么需要一个完整的描述形参的信息,这就类似于Objective-C中的消息签名,需要把形参的标签名(外部名)加上。不过,由于Swift是强类型语言,因此也可以直接指定方法引用的类型来确定指向哪个重载方法。
class ViewController: NSViewController { override func viewDidLoad() { super.viewDidLoad() // 由于myMethod方法被重载, // 因此这里对funcRef显式指定类型来指明指向不带任何参数的myMethod方法 let funcRef: () -> Void = self.myMethod funcRef() // 这里使用方法签名myMethod(a:)来指明指向myMethod(a a: Int)方法 var methodRef = self.myMethod(a:) methodRef(a: 100) // 这里使用方法签名myMethod(_:)来指明指向myMethod(_ a: Int)方法 methodRef = self.myMethod(_:) methodRef(a: 200) } func myMethod() { print("My method!") } func myMethod(a a: Int) { print("Method2 value = \(a)") } func myMethod(_ a: Int) { print("Method3 value = \(a)") } override var representedObject: AnyObject? { didSet { // Update the view, if already loaded. } } }
在上述代码中,我们不能用self.myMethod()来表示一个不带参数的方法引用,也不能用myMethod(_),因为这两种形式已经表示了方法调用,而不是方法签名。方法签名中,形参列表中必然至少要包含一个冒号。
当然,在Swift2.2中,self.myMethod在含有重载方法的情况下,不能直接表示没有任何形参的方法,这点非常遗憾~如果对funcRef不指明函数类型,那么编译器会报“存在歧义的方法名”的错误。实际上,在Swift中,如果一个方法包含了一个参数,那么也必然会存在一个冒号,无论该参数是否具有外部名,所以希望这点能在Swift 3.x版本中有所改进!
标签:
原文地址:http://www.cnblogs.com/zenny-chen/p/5598704.html