Xcode 9 RespondsToSelector问题

时间:2017-07-28 10:24:36

标签: swift xcode swift4

NSObject'回复'方法似乎在最新版本的Xcode 9 Beta 4,Swift 4.0版上被打破。

下面是在Xcode 8上测试的示例代码(工作正常),在Xcode 9上,方法'响应'在所有情况下都返回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

1 个答案:

答案 0 :(得分:3)

responds方法没有任何问题。由于在{8}中实现了SE-0160,因此这些方法不再自动暴露给Objective-C。

如果您将@objc添加到每个方法签名的开头(您希望向Objective-C公开),您会发现responds然后返回{{ 1}}。

true

或者,您也可以将public class Worker : NSObject { @objc public func work() { } @objc public func eat(_ food: AnyObject) { } @objc public func sleep(_ hours: Int,_ minutes: Int) { } } 添加到类中,以将所有方法公开给Objective-C。

@objMembers

您的第三个@objMembers public class Worker : NSObject { public func work() { } public func eat(_ food: AnyObject) { } public func sleep(_ hours: Int,_ minutes: Int) { } } 语法错误。它应为Selector,因为由于前面的"sleep::"而未使用minutes标签。