3

私はObjective-CからSwift言語を書くために数日前にプロジェクトで問題に遭遇しました。 param はその場合です。false を返します。他のタイプを試しましたが、true を返します。理由がわかりません。次のコードを参照してください。解決に役立ててください。どうもありがとうございました。

 enum TestEnum {
        case A
        case B
        case C
    }

    protocol TestAProtocol: NSObjectProtocol {
        func testEnum(testEnum: TestEnum);
        func testInt(testInt: Int);
    }

    class TestA: NSObject {
        var delegate: TestAProtocol?;

        func executeDelegateCallBack() {
            if (delegate != nil && delegate!.respondsToSelector(Selector("testEnum:"))) { // delegate!.respondsToSelector(Selector("testEnum:")) return false ?
                delegate?.testEnum(TestEnum.A);
            }

            if (delegate != nil && delegate!.respondsToSelector(Selector("testInt:"))) { // delegate!.respondsToSelector(Selector("testInt:")) return true ?
                delegate?.testInt(0);
            }
        }
    }

    class TestB: NSObject, TestAProtocol {
        func initTestB () {
            let testA: TestA = TestA();
            testA.delegate = self;
            testA.executeDelegateCallBack();
        }

        // mark TestAProtocol
        func testInt(testInt: Int) {

        }

        func testEnum(testEnum: TestEnum) {

        }
    }
4

1 に答える 1

6

respondsToSelector()Objective-C ランタイムを使用し、Objective-C と互換性のあるメソッドでのみ動作します。Swiftenumsは、 でマークされている場合に限り、Objective-C で表すことができ@objcます。これには、整数の raw 値が必要です。

だから

@objc enum TestEnum : Int {
    case A
    case B
    case C
}

あなたrespondsToSelector(Selector("testEnum:")は戻りtrueます。

ただし、メソッドの存在のテストは、オプションのプロトコル メソッドでのみ意味があり、これらは@objcプロトコルでのみ使用できることに注意してください。次に例を示します。

@objc enum TestEnum : Int {
    case A
    case B
    case C
}

@objc protocol TestAProtocol: NSObjectProtocol {
    optional func testEnum(testEnum: TestEnum)
    func testInt(testInt: Int)
}

そして、代わりにオプションのチェーンを使用する方がはるかに簡単です respondsToSelector:

func executeDelegateCallBack() {
    delegate?.testEnum?(.A)

    // ...
}

またはより詳細:

func executeDelegateCallBack() {
    if let testEnum = delegate?.testEnum {
        testEnum(.A)
    } else {
        print("delegate is `nil` or does not respond to `testEnum`")
    }

    // ...
}
于 2015-12-15T08:35:18.107 に答える