Xcode 9 响应选择器问题



NSObject 'responds' 方法似乎在最新版本的 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

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标签。

最新更新