[Swift 必备 Tips] SELECTOR

作者: Zakerberg | 来源:发表于2017-09-19 11:25 被阅读12次

转自 原文链接

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

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

在 Swift 中没有@selector了,取而代之,从 Swift 2.2 开始我们使用#selector来从暴露给 Objective-C 的代码中获取一个 selector。类似地,在 Swift 里对应原来SEL的类型是一个叫做Selector的结构体。像上面的两个例子在 Swift 中等效的写法是:

和 Objective-C 时一样,记得在callMeWithParam后面加上冒号 (:),这才是完整的方法名字。多个参数的方法名也和原来类似,是这个样子


最后需要注意的是,selector 其实是 Objective-C runtime 的概念,如果你的 selector 对应的方法只在 Swift 中可见的话 (也就是说它是一个 Swift 中的 private 方法),在调用这个 selector 时你会遇到一个 unrecognized selector 错误

这是错误的代码

正确的做法是在private前面加上@objc关键字,这样运行时就能找到对应的方法了。

最后,值得一提的是,如果方法名字在方法所在域内是唯一的话,我们可以简单地只是用方法的名字来作为#selector的内容。相比于前面带有冒号的完整的形式来说,这么写起来会方便一些:

但是,如果在同一个作用域中存在同样名字的两个方法,即使它们的函数签名不相同,Swift 编译器也不允许编译通过:

对于这种问题,我们可以通过将方法进行强制转换来使用:

相关文章

  • [Swift 必备 Tips] SELECTOR

    转自原文链接 @selector是 Objective-C 时代的一个关键字,它可以将一个方法转换并赋值给一个SE...

  • Swift struct Mutable 的方法

    @(Swifter - 100 个 Swift 必备 Tips (第二版) 读书笔记)[swift][ios] 1...

  • @autoclosure 和 ?? 讲解

    本人摘录来自: 王巍 (onevcat). 《Swifter - 100 个 Swift 必备 Tips (第二版...

  • Swift 正则表达式

    自定义符号正则匹配 摘录来自: 王巍 (onevcat). “Swifter - Swift 必备 Tips (第...

  • 那些有用的tips

    本文本人阅读@onevcat 的 《Swifter - 100 个Swift 必备 tips》后所做笔记,有兴趣可...

  • Swift3 柯里化 (Currying)

    前言:本文是 在 王巍 (onevcat). “Swifter - Swift 必备 Tips (第三版)”。 i...

  • iOS Swift中的Protocol

      最近在看王巍大神的《Swift必备Tips》这本书,发现里面写的Tips都很实用,很值得推荐,是个进阶的不错选...

  • [Swift 必备 Tips] #warning

    许多人喜欢OC中的#warning ,但是Swift中要怎么写呢? TAGS="TODO:|FIXME:"echo...

  • [Swift 必备 Tips] LOCK

    转自原文链接 无并发,不编码。而只要一说到多线程或者并发的代码,我们可能就很难绕开对于锁的讨论。简单来说,为了在不...

  • Designated,Convenience 和 Require

    摘录至喵神的《100个swift必备Tips》 我们在深入初始化方法之前,不妨先想想Swift中的初始化想要达到一...

网友评论

    本文标题:[Swift 必备 Tips] SELECTOR

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