我想检查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
不是这种情况。
...谢谢
答案 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
}