当前位置:  开发笔记 > IOS > 正文

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

如何解决《为什么delegate.respondsToSelector(Selector("testEnum:"))这段代码会以快速语言返回false?》经验,为你挑选了1个好方法。



1> Martin R..:

respondsToSelector()使用Objective-C运行时,仅适用于与Objective-C兼容的方法.Swift enums只能在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`")
    }

    // ...
}

推荐阅读
放ch养奶牛
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有