2017-07-28 38 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 ::」。 –