3

前几天我是从Objective-C写Swift语言的,在项目中遇到了一个问题。这个问题是在使用respondsToSelector("testEnum:")函数检查是否实现了testEnum:,if的函数时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,并且这要求它们有一个整数原始值。

所以随着

@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 回答