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)
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)
| 归档时间: |
|
| 查看次数: |
825 次 |
| 最近记录: |