1. ホーム
  2. オブジェクティブC

[解決済み】SwiftのrespondsToSelectorに相当するものは何ですか?

2022-04-22 12:09:08

質問

ググってみたのですが、swiftに相当するものがわかりません。 respondsToSelector: があります。

これしかなかったんです( respondsToSelector の Swift 代替品です。 私はデリゲートを持っていないので、デバイス上で実行するときに新しいAPIが存在するかどうかをチェックし、存在しない場合は以前のバージョンのAPIにフォールバックしたいだけです。

どのように解決するのですか?

前述の通り、Swiftでは を使えば、ほとんどの場合、必要なことを実現することができます。 ? オプションのアンラッパー演算子 . これにより、オブジェクトが存在する場合にのみ、そのオブジェクトのメソッドを呼び出すことができます(not nil )であり、かつそのメソッドが実装されていること。

それでもなお respondsToSelector: の一部として残っています。 NSObject プロトコルを使用します。

を呼び出している場合 respondsToSelector: をSwiftのObj-C型で使用する場合、期待したのと同じように動作します。あなた自身のSwiftクラスでこれを使用している場合、あなたのクラスが以下のものを派生させる必要があります。 NSObject .

セレクタに反応するかどうかを確認できるSwiftクラスの例です。

class Worker : NSObject
{
    func work() { }
    func eat(food: AnyObject) { }
    func sleep(hours: Int, minutes: Int) { }
}

let worker = Worker()

let canWork = worker.respondsToSelector(Selector("work"))   // true
let canEat = worker.respondsToSelector(Selector("eat:"))    // true
let canSleep = worker.respondsToSelector(Selector("sleep:minutes:"))    // true
let canQuit = worker.respondsToSelector(Selector("quit"))   // false

重要なのは、パラメータ名を省略しないことです。この例では Selector("sleep::") ではない と同じです。 Selector("sleep:minutes:") .