SELECTOR
2015-11-02 21:02
302 查看
SELECTOR
由 王巍 (@ONEVCAT) 发布于 2014/08/17@selector是 objc 时代的一个关键字,它可以将一个方法转换并赋值给一个
SEL类型,它的表现很类似一个动态的函数指针。在 objc 时 selector 非常常用,从设定 target-action,到自举询问是否响应某个方法,再到指定接受通知时需要调用的方法等等,都是由 selector 来负责的。在 objc 里生成一个 selector 的方法一般是这个样子的:
-(void) callMe { //... } -(void) callMeWithParam:(id)obj { //... } SEL someMethod = @selector(callMe); SEL anotherMethod = @selector(callMeWithParam:); // 或者也可以使用 NSSelectorFromString // SEL someMethod = NSSelectorFromString(@"callMe"); // SEL anotherMethod = NSSelectorFromString(@"callMeWithParam:");
一般为了方便,很多人会选择使用
@selector,但是如果要追求灵活的话,可能会更愿意使用
NSSelectorFromString的版本 -- 因为我们可以在运行时动态生成字符串,从而调用到对应的方法。
在 Swift 中没有
@selector了,因此我们要生成一个 selector 的话只能使用字符串。Swift 里对应原来 selector 的类型是一个叫做
Selector的结构体,它提供了一个接受字符串的初始化方法。像上面的两个例子在 Swift 中等效的写法是:
func callMe() { //... } func callMeWithParam(obj: AnyObject!) { //... } let someMethod = Selector("callMe") let anotherMethod = Selector("callMeWithParam:")
和 objc 时一样,记得在
callMeWithParam后面加上冒号 (:),这才是完整的方法名字。多个参数的方法名也和原来类似,大概会是这个样子:
func turnByAngle(theAngle: Int, speed: Float) { //... } let method = Selector("turnByAngle:speed:")
另外,因为
Selector类型实现了
StringLiteralConvertible,因此我们甚至可以不使用它的初始化方法,而直接用一个字符串进行赋值,就可以完成创建了。
最后需要注意的是,selector 其实是 objc runtime 的概念,如果这个你的 selector 对应的方法只在 Swift 中可见的话 (也就是说它是一个 Swift 中的 private 方法),在调用这个 selector 时你会遇到一个 unrecognized selector 错误:
这是错误代码
private func callMe() { //... } NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector:"callMe", userInfo: nil, repeats: true)
正确的做法是在
private前面加上
@objc关键字,这样运行时就能找到对应的方法了。
@objc private func callMe() { //... } NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector:"callMe", userInfo: nil, repeats: true)
另外,如果方法的第一个参数有外部变量的话,在通过字符串生成
Selector时还有一个约定,那就是在方法名和第一个外部参数之间加上
with:
func aMethod(external paramName: AnyObject!) { ... }
想获取对应的获取
Selector,应该这么写:
let s = Selector("aMethodWithExternal:")
相关文章推荐
- 软件文档的概念和细分
- TCP/IP实现以及常见问题
- 小电梯,学问大
- linux 基本操作笔记
- HDU 4027 Can you answer these queries?
- 【离散数学】实验三 偏序关系中盖住关系的求取及格论中有补格的判定
- 贾志鹏线性筛
- 我的电磁学讲义10:磁感应强度 毕奥-萨伐尔定律
- 【即时通讯】即时通讯及XMPP概述及…
- 【网络编程】Socket概念及简单聊天…
- 让Win7系统的管理员账户永久开启的设置方法
- 【网络编程】TCP/IP、UDP、网络概…
- 【CoreData】分页查询和模糊查询
- 【CoreData】多个数据库使用
- 淘宝 登录 3步登录 取得cookie的方式
- SHELL脚本 数学运算、数组、文本处理
- 利用Tesseract来识别验证码
- 01_iOS开发需要准备什么?
- 【CoreData】表之间的关联
- IOS开发——01_第一个OC程序