ios - Swift 类指针作为?类协议(protocol)?

标签 ios swift class casting protocols

我有一个类,我们称它为 SomeClass。 SomeClass 的实例有一个可选的指向 SomeOtherClass 的指针。这样就可以实例化SomeClass的实例,给定一个指向SomeOtherClass(或者SomeOtherClass的子类)的指针,然后这个指针就可以用来动态创建属于SomeClass的这个SomeOtherClass的实例。例如;

class SomeClass {
    var classPointer: SomeOtherClass.Type?
}

class SomeOtherClass {
}

到目前为止一切顺利。现在,我有一个协议(protocol) - 让我们称之为 SomeProtocol - 我希望 SomeOtherClass 遵守。这个协议(protocol)里面有类函数:

protocol SomeProtocol {
    static func someClassFunction()
}

extension SomeOtherClass : SomeProtocol {
    class func someClassFunction() {
        print("I am a class function being executed on SomeOtherClass")
    }
}

正如预期的那样,我可以像这样在 SomeOtherClass 上调用这个协议(protocol)类函数:

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"
}

构建失败并出现错误“someClassFunction 的静态成员不能用于 SomeProtocol 类型的实例”。

有没有办法完成我正在尝试的事情?目前,如果这不起作用,我只能想到这些替代方案(没有一个是可取的,而且它们都很老套):

  1. 切换到 objective-c 。
  2. 将协议(protocol)改为使用实例函数,然后实例化 SomeClass 的 classPointer 的临时实例并向其发送任何必要函数的消息,然后释放该实例。

为了完整起见,这里是可以粘贴到 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 转换为协议(protocol)的类型,而不是协议(protocol)本身。线路:

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()
}

而且有效:)。

关于ios - Swift 类指针作为?类协议(protocol)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35871200/

相关文章:

ios - 在 iOS 上,在屏幕上绘制任何内容的总体机制是什么?

iphone - 从 CGBitmapContextGetData 获取图像

swift - 如何在倒计时器标签中显示毫秒?

swift - 在 Swift 3 中迭代和操作字符串

c# - 哪个最适合数据存储结构/类?

c++ - 以类为参数调用模板类的静态模板方法

c# - 2 "Dynamic"div 之间的 "Static"div [CSS][ASP.NET]

ios - iOS 10 上的 UIColor 缺少蓝色值

iphone - 如何从 url 为直播的相机播放直播

Swift:将 println 与元组一起使用时如何更好地格式化输出?