Swift - Selector
@selector
是Objective-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相关推荐
- Swift Selector
Selector 是swift 和OC 中 常用到的 在button 中. 在ges 中 都有使用到. 一般情况下我们是这样使用的 例如另外抽出去一个类 他负责创建了button要执行点击事件 fun ...
- OC 与 Swift 区别
OC 与 Swift 区别 一.block = 闭包 OC--block typedef void(^successBlock)(NSURL* url,id data); swift--闭包 type ...
- [Swift]最强UIButton解析 | #selector()绑定点击事件
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...
- Swift 圆环进度条
Swift 圆环进度条 import UICircularProgressRing import UIKit import UICircularProgressRing class ViewContr ...
- Swift之SDWebImage第三方框架
在学习Swift过程中,最害怕的使用了OC的第三方框架 好不容易配置成功了,却出现了意外的Bug [UIImageView setImageWithURL:]: unrecognized select ...
- swift 错误集合 ------持续更新中
从今天开始凡是在用swift中遇到的错误都会在本博客持续更新 便于自己学习和快速开发 2017.7.20 如果你的程序写的有进入后台的方法,例如我的博客中点击home进入后台持续定位的那篇文章,发信进 ...
- swift 多线程GCD和延时调用
GCD 是一种非常方便的使用多线程的方式.通过使用 GCD,我们可以在确保尽量简单的语法的前提下进行灵活的多线程编程.在 "复杂必死" 的多线程编程中,保持简单就是避免错误的金科玉 ...
- 如何用Swift实现一个好玩的弹性动画
本文由CocoaChina译者浅夏@旧时光翻译自Raywenderlich 原文:How To Create an Elastic Animation with Swift 每个像样的iOS应用程序一 ...
- Swift学习: 从Objective-C到Swift
作者:@方秋枋(GitHub) 这篇文章是自己学习Swift的笔记与深化.希望这篇文章能够帮助已经有Objective-C经验的开发者更快地学习Swift.同时也品味到Swift的精妙之处. 结论放在 ...
最新文章
- *** WARNING L1: UNRESOLVED EXTERNAL SYMBOL
- win ftp 指定的密码无效。请键入新密码。_重设OS X (macOS)系统帐户密码的5种方法...
- 天涯明夜刀手游微信第一服务器,天涯明月刀手游微信哪个区人多 微信一区选哪个好[多图]...
- JAVA设计模式 - 工厂方法模式
- IDEA如何添加本地项目到git上
- Wodpress模板
- java private 内部类_java中外部类是否可以访问内部类的private 元素呢?
- php与tp5,PHP开发(33)-ThinkPHP5.0(5)命名空间与TP5-PhpStorm
- 【java笔记】可变参数
- bzoj 1010: [HNOI2008]玩具装箱toy
- 雷达存在感应器技术,实时感知控制应用,雷达人体探测方案
- Windows系统中常见的文件后缀名有哪些
- 香港服务器到大陆各地的网络延迟大小
- 怎么在中国知网免费下载论文?
- 优秀的网站加速插件 – WP rocket详细设置教程
- 小米应用闪退解决方法
- html页面上传文件mui,mui 文件上传注意问题
- 营销革命4.0 从传统到数字
- 北京车辆过户全过程(详细得狠)20160729更新,图4幅
- python学习每日一题【20200226】python实现“分解质因数”的计算
热门文章
- 一键导出PostgreSQL数据库表设计为word文档
- Flutter SocketException: OS Error: No route to host, errno = 113, address = XXX
- 力扣121题买卖股票的最佳时机 简单容易明白
- 2021赤峰二中高考成绩查询,赤峰二中2019高考成绩喜报、一本上线人数情况
- python airflow_Airflow使用经验分享
- JAVA游戏开发之FPS精准控制
- Java String格式日期加1秒(分钟或小时)
- Drupal Theme 主题系统:入门与进阶教程
- 西工大电子服务系统设计复习总结
- 软件开发过程与项目管理(11.软件项目风险计划)