美文网首页Swift学习iOS开发
IOS&swift中#selector的怪异语法

IOS&swift中#selector的怪异语法

作者: Lebus | 来源:发表于2018-10-02 23:05 被阅读380次

    #selector()里面的参数是需要调用的方法名。

    在Swift中,#selector常用于TimerUIBarButtonItem等类中的target/action方法中。例如,当您创建计时器时,您需要告诉它在计时器触发时通知谁(target)以及应该调用哪个#selector(action)。对于bar button items也是如此:当按下按钮时,应该调用哪个选择器,以及在什么对象上?

    在Swift 2.2之前,#selector的参数用的是字符串Selector(“buttonTapped:”),这种语法容易出现很多错别字。Swift 3提供了#selector一种安全的语法。

    Swift的#selector与Objective-C的@selector 一样。Objective-C的选择器语法非常简单 - @selector(methodName:arguments:)。Swift有点复杂。

    Swift有函数重载overload(同名,不同参数)的概念,而Objective-C没有。您可能需要消除#selector引用哪个函数的歧义。

    这是一个重载doStuff方法:

    class Thing {    
    ...    
    func doStuff(stuff: Int) {       
     print("do Stuff \(stuff)")    
    }    
    func doStuff(stuff: Double, fluffy: String) {        
    print("do Stuff \(stuff) - \(fluffy)")    
    }
    

    当您直接调用doStuff时,Swift可以根据您传递的参数确定要使用哪一个。但用#selector调用的话无法知道参数的类型。如果您尝试为其创建选择器doStuff,则会出现模糊使用的error

    解决方法是加入参数标签:

    #selector(Thing.doStuff(stuff:fluffy:)))
    

    这时候调用的就是第二个方法。

    相关文章

      网友评论

        本文标题:IOS&swift中#selector的怪异语法

        本文链接:https://www.haomeiwen.com/subject/trnaoftx.html