码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2016-06-19 21:22:18      阅读:364      评论:0      收藏:0      [点我收藏+]

标签:

由于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版本)

标签:

原文地址:http://www.cnblogs.com/zenny-chen/p/5598704.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!