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

问题描述 投票:2回答:2

我想检查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 swift-protocols
2个回答
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
投票

函数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
}
© www.soinside.com 2019 - 2024. All rights reserved.