2017-07-28 40 views
0

NSObject'响应'方法似乎在最新版本的Xcode 9 Beta 4,Swift版本4.0上被打破。Xcode 9响应选择器问题

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

+0

相关:https://stackoverflow.com/questions/44390378/how-can-i-deal-with-objc-inference-deprecation-with-selector-in-swift-4 –

+1

Xcode 9应该建议现代的' #selector(Worker.work)'语法。一旦你使用它,编译器会警告:*“#selector'的参数指的是'Worker'中的实例方法'work()',取决于Swift 4中弃用的'@objc'推断”* –

+0

@MartinR,I将会建议OP使用'#selector'语法,但是然后'#selector(quit)'甚至不会编译,这会否定执行运行时检查的能力。 – vacawama

回答

3

有没有错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标签由于前面的_而未被使用。

+0

谢谢,对于第三种语法,它似乎并不需要“_”,所以只是“sleep ::”。 –