检查Any.Type是否符合Swift中的协议

时间:2018-03-01 23:24:57

标签: swift swift-protocols

我想检查Any.Type的给定值是否符合Swift中的协议。似乎可以通过调用@objc来检查基于class_conformsToProtocol()的协议,但我不知道如何使用纯swift协议检查它。

// ObjC

@objc protocol MyObjcProtocol {
}

class MyObjcClass: NSObject, MyObjcProtocol {
}

class_conformsToProtocol(MyObjcClass.self, MyObjcProtocol.self) // true

// Swift

protocol MySwiftProtocol: AnyObject {
}

class MySwiftClass: MySwiftProtocol {
}

class_conformsToProtocol(MySwiftClass.self, MySwiftProtocol.self) // error

如果是实例的情况,我可以使用if let object = object as? MySwiftProtocol { ... }类型的方法进行检查,但Any.Type不是这种情况。

...谢谢

2 个答案:

答案 0 :(得分:4)

要检查纯Swift代码,您可以执行以下操作:

protocol MySwiftProtocol: AnyObject {
}

class MySwiftClass: MySwiftProtocol {
}

if MySwiftClass.self as? MySwiftProtocol.Type != nil {
    print("conforms")
} else {
    print("does not conform")
}

或更简单:

if MySwiftClass.self is MySwiftProtocol.Type {

答案 1 :(得分:-1)

函数class_conformsToProtocol(_:_:)是一个Objective-C运行时库函数,因此要使用它,所提供的参数必须具有Objective C的表示。

就像使用#selector()提供选择器时一样,我们必须在方法声明之前提供@objc这样,该特定方法可以在Objective-C中表示。

您可以在Apple文档中找到有关Objective-C Runtime

的更多信息

要检查班级是否确认协议,您可以尝试:

protocol MySwiftProtocol: AnyObject {
}

class MySwiftClass: MySwiftProtocol {
}

if let mySwiftProtocol = MySwiftClass() as? MySwiftProtocol {
    //do stuff if confirms protocol
} else {
    //do stuff if doesn't confirm protocol
}