在最新版本的Xcode 9 Beta 4、Swift版本4.0上,NSObject“responds”方法似乎被破坏。
下面是一个在Xcode 8上测试的示例代码(工作正常),在Xcode 9上,方法“response”对于所有情况都返回false。
任何帮助都将不胜感激。

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

示例源:https://stackoverflow.com/a/24168825

最佳答案

responds方法没有问题。由于Swift 4中实现的SE-0160,这些方法不再自动暴露于Objective-C。
如果将@objc添加到每个方法签名的开头(希望公开给Objective-C),您将发现responds然后返回true

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

或者,也可以将@objMembers添加到类中,以将所有方法公开给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没有使用_标签。

10-08 01:01