我有一个类,让它叫SomeClass。 SomeClass的实例有一个指向SomeOtherClass的可选指针。通过这种方式,给定一个指向SomeOtherClass(或SomeOtherClass的子类)的指针,可以实例化SomeClass的实例,然后可以使用该指针来动态创建属于SomeClass的这个SomeOtherClass的实例。例如;Swift类指针为?类协议?
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,如果是的话,执行它的类函数。所以,我尝试转换指针使用作为?:
// 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"
}
而构建失败,“someClassFunction的静态成员不能在类型SomeProtocol的情况下被使用”的错误。
有没有办法完成我正在尝试的?目前,如果这不起作用,我只能想到这些替代品(没有一个是可取的,而且都很朴素):
- 切换到目标c。
- 将协议切换为使用实例函数,然后实例化SomeClass的classPointer的临时实例并使用任何必要的函数将其发送消息,然后释放该实例。
为了完整起见,这里是所有的代码放在一起,可以粘贴到游乐场(它不会建立因错误我虽然提到过)的:
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"
}
感谢您的帮助您可以提供, - 亚当