Xcode 9 RespondsToSelector 问题

Xcode 9 RespondsToSelector Issue

NSObject 'responds' 方法似乎在最新版本 Xcode 9 Beta 4,Swift 4.0.

上被破坏

下面是在 Xcode 8 上测试的示例代码(工作正常),在 Xcode 9 上测试的方法 'responds' returns 在所有情况下都是错误的。

如有任何帮助,我们将不胜感激。

public class Worker : NSObject
{
    public func work() { }
    public func eat(_ food: AnyObject) { }
    public func sleep(_ hours: Int,_ minutes: Int) { }
}

let worker = Worker()

let canWork = worker.responds(to: Selector(("work")))   // true
let canEat = worker.responds(to: Selector(("eat:")))    // true
let canSleep = worker.responds(to: Selector(("sleep:minutes:")))    // true
let canQuit = worker.responds(to: Selector(("quit")))   // false

示例来源:

responds方法没有问题。由于 SE-0160 在 Swift 4 中实现,这些方法不再自动暴露给 Objective-C.

如果您将 @objc 添加到 each 方法签名(您想要公开给 Objective-C)的开头,您会发现 responds 然后 returns true.

public class Worker : NSObject
{
    @objc public func work() { }
    @objc public func eat(_ food: AnyObject) { }
    @objc public func sleep(_ hours: Int,_ minutes: Int) { }
}

或者,您也可以将 @objMembers 添加到 class 以将 所有 方法公开给 Objective-C.

@objMembers
public class Worker : NSObject
{
    public func work() { }
    public func eat(_ food: AnyObject) { }
    public func sleep(_ hours: Int,_ minutes: Int) { }
}

您的第三个 Selector 语法错误。应该是"sleep::"因为前面的_.

没有使用minutes标签