我想检查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
不能是这种情况。
谢谢...
要检查纯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 {
函数class_conformsToProtocol(_:_:)
是一个Objective-C运行时库函数,因此要使用它,所提供的参数必须具有Objective C的表示。
就像使用#selector()
提供选择器时一样,我们必须在方法声明之前提供@objc
,这样,该特定方法可以在Objective-C中表示。
您可以在Apple Docs for 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
}