一尘不染

NSTimer不会调用私有函数作为选择器

swift

我正在研究要点:PasteboardWatcher.swift,在其中我像这样调用了NSTimer对象:

func startPolling () {
        // setup and start of timer
        timer = NSTimer.scheduledTimerWithTimeInterval(2, target: self, selector: Selector("checkForChangesInPasteboard"), userInfo: nil, repeats: true)
}

checkForChangesInPasteboard函数的定义是:

func checkForChangesInPasteboard() {
        // definition continues..
}

我不想将函数公开checkForChangesInPasteboard给其他类,因此我想将其标记为私有,但是由于某种原因,它抛出以下异常:

-[PasteboardWatcher.PasteboardWatcher checkForChangesInPasteboard]: unrecognized selector sent to instance

如果我不将其标记为私有,那么它会完美运行。

我有什么办法可以将此方法保留为私有方法,对其他类隐藏呢?


阅读 199

收藏
2020-07-07

共1个答案

一尘不染

根据将 Swift与Cocoa和Objective-C结合使用

“标有private修饰符的声明不会出现在生成的标题中。除非将私有声明也使用@ IBAction,@
IBOutlet或@objc进行显式标记,否则它们不会公开给Objective-C。”

摘自:苹果公司。“将Swift与Cocoa和Objective-C结合使用(Swift 2预发行版)。”
iBooks。https://itun.es/us/utTW7.l

因此,您可以标记函数@objc以获取所需的行为。我只是在其中一个使用公开可见性的应用程序中对此进行了测试,因为我认为Objective-
C根本看不到私有声明,并且在标记为private并用修饰时可以正常工作@objc


我刚刚看到了一个相关的问题:具有目标选择器的Swift访问控制 —基本上是同一件事,但我认为您的表达方式较为笼统,因此不能严格重复。

2020-07-07