【iOS开发】@objc private class func 与 Selector

本文介绍在 Swift 中 使用 KVO 时,一些需要注意的事项,下面截取了两段我自己在项目中使用的代码。

self.timer = NSTimer.scheduledTimerWithTimeInterval(timeInterval, target: self,
        selector: "moveText", userInfo: nil, repeats: true)

NSNotificationCenter.defaultCenter().addObserver(self,
        selector: "appEnterForeground", name: nil, object: nil)

第一个是第一个定时器(NSTimer),第二个是一个页面的监听事件。即,让程序不断地观察现在的『某个状态』,当这个状态符合某个条件时,就去执行 Selector 中的代码。比如,我们的界面中有一个让用户输入年龄的 UITextField,然后我们可以观察(监听),当发现用户在这里输入『0』时,我们就给一个提示:『年龄至少为1』。

简单介绍完毕,下面说注意事项。


<h3>1. private 关键字</h3>
最简单的使用 Selector 的情况,就是如上面所列出的,在 NSTimer 中写 selector 为 "moveText",然后我们在同一个文件中,再相应地写一个

func moveText(){ 
    // Your Code
}

就可以了。
然而如果你想把它声明为一个 private func,即不希望其他文件调用这个函数,就会出现问题,通俗地讲:private 使得这个函数不能被『外部』调用,而 Selector 对它的调用,实际上就是一种『外部调用』。

【解决方案】
KVO 是基于 KVC 和动态派发技术(Dynamic Dispatch)的,Swift 为了效率禁用了 Objective-C 中有的动态派发。那么你把这个动态特性再加回来就可以了~

1.通过 @objc 关键字来使用动态特性

@objc private func moveText(){ 
    // Your Code
}

2.通过 dynamic 关键字来让这个函数拥有与 OC 中动态调用时相同的运行时特性(@objc 足矣,这个一般用不上)

dynamic private func moveText(){ 
    // Your Code
}

更多关于 dynamic 关键字的内容可以参考:http://swifter.tips/kvo/


<h3>2. class 关键字</h3>
如果你想把这个函数声明为 class func

class func moveText(){ 
    // Your Code
}

则本文最开始的代码中的 target 应该由 self 换为 MyClass.self (假设这段代码写在名为 MyClass 的类中)

self.timer = NSTimer.scheduledTimerWithTimeInterval(timeInterval, target: MyClass.self,
        selector: "moveText", userInfo: nil, repeats: true)

最后, 以上关键字是可以叠加使用的,如果你愿意,可以写成下面这样:

@objc private class func moveText(){ 
    // Your Code
}

我在 StackOverFlow 中的回答,及其它相关:

http://stackoverflow.com/questions/30027322/how-to-call-private-class-function-from-selector-in-swift/34291667#34291667

http://stackoverflow.com/questions/28184350/4-questions-about-selectors-in-swift

如有谬误,欢迎在评论中指出。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,776评论 0 9
  • Meditation isn't just for yogis or New Age gurus — it's a...
    ecchanger阅读 911评论 0 6
  • (1) 二楞一直很苦恼,17年的工作生涯,对于他来说太久了点,久了点也就算了,还特么没啥成绩。一直处于滚滚大都市-...
    刘云龙_深圳阅读 256评论 0 0
  • B君在很长一段时间里都是我的偶像,她是那个院子里的小公主,很可爱的小姑娘,即使站在贫穷的废墟里,也兀自发光发亮。 ...
    苏越阅读 288评论 1 1
  • 关注行业,了解行业动态和趋势可以说是产品经理这个岗位一项基本的职责和工作。每个人参与的项目或策划的产品都和行业有着...
    阿外rybobo阅读 1,013评论 2 24