@selectorObjective-C 时代的一个关键字,它可以将一个方法转换并赋值给一个SEL 类型,它的表现很类似一个动态的函数指针。在Objective-C 中selector 非常常用,从设定 target-action,到自举询问是否响应某个方法,再到指定接受通知时需要调用的方法等等,都是有selector 来负责的。在Objective-C 里生成一个selector 的方法一般是这样的:

- (void)callMe {// ...
}- (void)callMeWithParam:(id)obj {// ...
}SEL someMetohd = @selector(callMe);
SEL anotherMethod = @selector(callMeWithParam:);// 也可以使用NSSelectorFromString
SEL someMetohd = NSSelectorFromString(@"callMe");
SEL anotherMethod = NSSelectorFromString(@"callMeWithParam:");

一般为了方便,很多人会选择使用@selector,但是如果要追求灵活的话,可能会更愿意使用NSSelectorFromString 的版本----因为我们可以在运行时动态生成字符串,从而通过方法的名字来调用对应的方法

在Swift 中没有@selector 了,我们要生成一个selector 的话可以使用字符串。当然方法必须被@objc 关键字修饰,如果没有@objc 修饰,则无法正常被调用,也可以使用#selector 关键字进行获取。Swift 里对应原来SEL 的类型是一个叫作Selector结构体,它提供了一个接受字符串的初始化方法。上面的两个例子在Swift 中等效的写法是:

@objc func callMe() {// ...print("aaaaaaaa")
}@objc func callMeWithParam(obj: AnyObject) {// ...print(obj)
}let someMethod = Selector.init("callMe")
let anotherMethod = Selector.init("callMeWithParamWithObj:")
print(someMethod)
print(anotherMethod)

和Objective-C 中一样,但需要注意多参数方法名拼写,即第一个参数,需要多加一个With 以及参数名,之后的参数不需要添加,如果参数被 _ 修饰时,则都无需拼写With 及参数名

@objc func callMeWithParam(_ obj: AnyObject, obj2: AnyObject) {// ...print(obj)
}
// 上面的方法为
let anotherMethod = Selector.init("callMeWithParam:obj2:")// 修改方法参数
@objc func callMeWithParam(_ obj: AnyObject, _ obj2: AnyObject) {// ...print(obj)
}
// 上面的方法为
let anotherMethod = Selector.init("callMeWithParam::")

另外,如果方法的第一个参数有外部变量的话,需要使用外部变量,并且在第一个外部变量之加上With其他的外部变量则使用外部变量

@objc func callMeWithParam(external paramName: AnyObject) {// ...print(paramName)
}
// 上面的方法为
let anotherMethod = Selector.init("callMeWithParamWithExternal:")// 修改方法参数
@objc func callMeWithParam(external paramName: AnyObject, exter param: AnyObject) {// ...print(paramName)
}
// 上面的方法为
let anotherMethod = Selector.init("callMeWithParamWithExternal:exter:")

其实最简单的方法就是使用#selector 关键字进行获取Selector

let method = #selector(self.callMeWithParam(external:exter:))
// 或者
let method = #selector(callMeWithParam(external:exter:))

Swift - Selector相关推荐

  1. Swift Selector

    Selector 是swift 和OC 中 常用到的 在button 中. 在ges 中 都有使用到. 一般情况下我们是这样使用的 例如另外抽出去一个类 他负责创建了button要执行点击事件 fun ...

  2. OC 与 Swift 区别

    OC 与 Swift 区别 一.block = 闭包 OC--block typedef void(^successBlock)(NSURL* url,id data); swift--闭包 type ...

  3. [Swift]最强UIButton解析 | #selector()绑定点击事件

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...

  4. Swift 圆环进度条

    Swift 圆环进度条 import UICircularProgressRing import UIKit import UICircularProgressRing class ViewContr ...

  5. Swift之SDWebImage第三方框架

    在学习Swift过程中,最害怕的使用了OC的第三方框架 好不容易配置成功了,却出现了意外的Bug [UIImageView setImageWithURL:]: unrecognized select ...

  6. swift 错误集合 ------持续更新中

    从今天开始凡是在用swift中遇到的错误都会在本博客持续更新 便于自己学习和快速开发 2017.7.20 如果你的程序写的有进入后台的方法,例如我的博客中点击home进入后台持续定位的那篇文章,发信进 ...

  7. swift 多线程GCD和延时调用

    GCD 是一种非常方便的使用多线程的方式.通过使用 GCD,我们可以在确保尽量简单的语法的前提下进行灵活的多线程编程.在 "复杂必死" 的多线程编程中,保持简单就是避免错误的金科玉 ...

  8. 如何用Swift实现一个好玩的弹性动画

    本文由CocoaChina译者浅夏@旧时光翻译自Raywenderlich 原文:How To Create an Elastic Animation with Swift 每个像样的iOS应用程序一 ...

  9. Swift学习: 从Objective-C到Swift

    作者:@方秋枋(GitHub) 这篇文章是自己学习Swift的笔记与深化.希望这篇文章能够帮助已经有Objective-C经验的开发者更快地学习Swift.同时也品味到Swift的精妙之处. 结论放在 ...

最新文章

  1. *** WARNING L1: UNRESOLVED EXTERNAL SYMBOL
  2. win ftp 指定的密码无效。请键入新密码。_重设OS X (macOS)系统帐户密码的5种方法...
  3. 天涯明夜刀手游微信第一服务器,天涯明月刀手游微信哪个区人多 微信一区选哪个好[多图]...
  4. JAVA设计模式 - 工厂方法模式
  5. IDEA如何添加本地项目到git上
  6. Wodpress模板
  7. java private 内部类_java中外部类是否可以访问内部类的private 元素呢?
  8. php与tp5,PHP开发(33)-ThinkPHP5.0(5)命名空间与TP5-PhpStorm
  9. 【java笔记】可变参数
  10. bzoj 1010: [HNOI2008]玩具装箱toy
  11. 雷达存在感应器技术,实时感知控制应用,雷达人体探测方案
  12. Windows系统中常见的文件后缀名有哪些
  13. 香港服务器到大陆各地的网络延迟大小
  14. 怎么在中国知网免费下载论文?
  15. 优秀的网站加速插件 – WP rocket详细设置教程
  16. 小米应用闪退解决方法
  17. html页面上传文件mui,mui 文件上传注意问题
  18. 营销革命4.0 从传统到数字
  19. 北京车辆过户全过程(详细得狠)20160729更新,图4幅
  20. python学习每日一题【20200226】python实现“分解质因数”的计算

热门文章

  1. 一键导出PostgreSQL数据库表设计为word文档
  2. Flutter SocketException: OS Error: No route to host, errno = 113, address = XXX
  3. 力扣121题买卖股票的最佳时机 简单容易明白
  4. 2021赤峰二中高考成绩查询,赤峰二中2019高考成绩喜报、一本上线人数情况
  5. python airflow_Airflow使用经验分享
  6. JAVA游戏开发之FPS精准控制
  7. Java String格式日期加1秒(分钟或小时)
  8. Drupal Theme 主题系统:入门与进阶教程
  9. 西工大电子服务系统设计复习总结
  10. 软件开发过程与项目管理(11.软件项目风险计划)