Swift编程语言中的方法引用(基于2.2版本)

Posted zenny_chen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Swift编程语言中的方法引用(基于2.2版本)相关的知识,希望对你有一定的参考价值。

由于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版本中有所改进!

以上是关于Swift编程语言中的方法引用(基于2.2版本)的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式将 UISearchController 添加到 swift 2 中的 UITableView 标头

如何在 swift 2.2 中更改 pickerview 中的文本/字体大小?

Swift 2.2发布

如何在 Xcode8 上使用 Swift 2.2?

苹果编程语言Swift 2.2发布:支持Ubuntu Linux系统

Swift中的函数调用