[英]Swift Class Pointer as? Class Protocol?
我有一堂课,叫它SomeClass。 SomeClass的实例具有指向SomeOtherClass的可选指针。 通过这种方式,可以实例化SomeClass的实例,并提供指向SomeOtherClass(或SomeOtherClass的子类)的指针,然后可以使用该指针动态创建属于SomeClass的SomeOtherClass的实例。 例如;
class SomeClass {
var classPointer: SomeOtherClass.Type?
}
class SomeOtherClass {
}
到现在为止还挺好。 现在,我有了一个协议-让我们称之为SomeProtocol-我希望SomeOtherClass遵守该协议。 该协议具有类功能:
protocol SomeProtocol {
static func someClassFunction()
}
extension SomeOtherClass : SomeProtocol {
class func someClassFunction() {
print("I am a class function being executed on SomeOtherClass")
}
}
如预期的那样,然后可以在SomeOtherClass上调用此协议类函数,如下所示:
SomeOtherClass.someClassFunction() // Prints "I am a class function being executed on SomeOtherClass"
这是麻烦的部分。 我想动态确定SomeClass的classPointer的实例是否符合SomeProtocol,如果是,则对它执行类函数。 因此,我尝试使用as强制转换指针:
// Create an instance of SomeClass and set it's classPointer to the SomeOtherClass class
let someInstance = SomeClass()
someInstance.classPointer = SomeOtherClass.self
// Check if the instance's classPointer class conforms to the SomeProtocol protocol
if let conformingClass = someInstance.classPointer as? SomeProtocol {
// If so, execute the class function in SomeProtocol on the instance's classPointer
conformingClass.someClassFunction() // Build fails "Static member someClassFunction cannot be used on instance of type SomeProtocol"
}
并且构建失败,并显示错误“无法在SomeProtocol类型的实例上使用someClassFunction的静态成员”。
有什么方法可以完成我的尝试? 目前,如果这行不通,我只能想到这些替代方法(没有其他方法是可取的,它们都相当笨拙):
为了完整起见,这是可以粘贴到Playground中的所有代码(由于我提到的错误而无法构建):
class SomeClass {
var classPointer: SomeOtherClass.Type?
}
class SomeOtherClass {
}
protocol SomeProtocol {
static func someClassFunction()
}
extension SomeOtherClass : SomeProtocol {
class func someClassFunction() {
print("I am a class function being executed on SomeOtherClass")
}
}
// Create an instance of SomeClass and set it's classPointer to the SomeOtherClass class
let someInstance = SomeClass()
someInstance.classPointer = SomeOtherClass.self
// Check if the instance's classPointer class conforms to the SomeProtocol protocol
if let conformingClass = someInstance.classPointer as? SomeProtocol {
// If so, execute the class function in SomeProtocol on the instance's classPointer
conformingClass.someClassFunction() // Build fails "Static member someClassFunction cannot be used on instance of type SomeProtocol"
}
感谢您提供的任何帮助-亚当
啊啊! 像往常一样,一旦我发表SO帖子,我便会找到答案。
对于那些好奇的人,必须将classPointer强制转换为协议的Type,而不是协议本身。 该行:
if let conformingClass = someInstance.classPointer as? SomeProtocol {
需要更改为:
if let conformingClass = someInstance.classPointer as? SomeProtocol.Type {
然后,您将能够使用SomeProtocol中声明的类函数向conformingClass发送消息。 完整的工作代码为:
class SomeClass {
var classPointer: SomeOtherClass.Type?
}
class SomeOtherClass {
}
protocol SomeProtocol {
static func someClassFunction()
}
extension SomeOtherClass : SomeProtocol {
class func someClassFunction() {
print("I am a class function being executed on SomeOtherClass")
}
}
// Create an instance of SomeClass and set it's classPointer to the SomeOtherClass class
let someInstance = SomeClass()
someInstance.classPointer = SomeOtherClass.self
// Check if the instance's classPointer class conforms to the SomeProtocol protocol
if let conformingClass = someInstance.classPointer as? SomeProtocol.Type {
// If so, execute the class function in SomeProtocol on the instance's classPointer
conformingClass.someClassFunction()
}
它有效:)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.