为什么delegate.respondsToSelector(Selector("testEnum:"))这段代码会以快速语言返回false?

fly*_*ket 3 enums ios respondstoselector swift

我是几天前从Objective-C编写的Swift语言,在项目中我遇到了一个问题.这个问题是在使用respondsToSelector("testEnum:")函数检查是否实现testEnum的函数时: 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) {

        }
    }
Run Code Online (Sandbox Code Playgroud)

Mar*_*n R 6

respondsToSelector()使用Objective-C运行时,仅适用于与Objective-C兼容的方法.Swift enums只能在Objective-C中表示,如果它们被标记@objc,并且要求它们具有整数原始值.

所以

@objc enum TestEnum : Int {
    case A
    case B
    case C
}
Run Code Online (Sandbox Code Playgroud)

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)
}
Run Code Online (Sandbox Code Playgroud)

然后使用可选链接更简单,而不是 respondsToSelector:

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

    // ...
}
Run Code Online (Sandbox Code Playgroud)

或更详细:

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

    // ...
}
Run Code Online (Sandbox Code Playgroud)