【问题标题】:Why delegate.respondsToSelector (Selector ("testEnum:")) this code will return false in swift language?为什么delegate.respondsToSelector (Selector ("testEnum:")) 这段代码会在swift语言中返回false?
【发布时间】:2015-12-15 07:56:12
【问题描述】:

前几天我是从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) {

        }
    }

【问题讨论】:

  • 这不是你问题的答案,而是你的 ||应该是 && - 你希望委托不是零并响应选择器
  • 嗯,我在写一个测试例子,不要太关注,谢谢,我改一下!

标签: ios swift enums respondstoselector


【解决方案1】:

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

所以

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

您的respondsToSelector(Selector("testEnum:") 将返回true。

但是请注意,测试方法的存在只会使 使用 optional 协议方法进行感知,并且这些方法仅可用 对于@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`")
    }

    // ...
}

【讨论】:

  • 我正要发布同样的内容...稍微更正一下:TestAProtocol 不需要与 ObjC 兼容(至少在 Swift 2.0 中)。
  • @ArthurGevorkyan:optional 方法需要它(至少在我的 Swift 2.1 中)。
  • 现在我明白了。从选择性的角度来看,你是对的。我的意思是 respondsToSelector: 不需要运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-22
  • 1970-01-01
  • 2012-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多