2017-07-28 12 views
0

最新版のXcode 9 Beta 4、Swiftバージョン4.0ではNSObjectの 'responds'メソッドが壊れているようです。Xcode 9 RespondsToSelector Issue

以下は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) '構文を使用します。 Swift 4で廃止された '@objc'推論に依存する 'Worker'のインスタンスメソッド 'work()'を参照しています。* –

+0

@MartinR、I OPは '#selector'構文を使うことを示唆していましたが、' #selector(quit) 'はコンパイルされず、ランタイムチェックを行う能力を否定します。 – vacawama

答えて

3

responds方法には何の問題もありません。 Swift 4に実装されているSE-0160のため、これらのメソッドはObjective-Cに自動的に公開されなくなりました。

あなたは(あなたはObjective-Cのに公開すること)の先頭に各メソッドのシグネチャを@objcを追加する場合は、respondsその後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) { } 
} 

第3のSelector構文が間違っています。前述の_のためにminutesラベルが使用されていないため、"sleep::"である必要があります。

+0

おかげさまで、3番目の構文では、 "_"も必要ないと思われるので、単に "sleep ::"としてください。 –