swift - 如何从泛型类<T>调用基类上的静态方法?

标签 swift

我试图从通用子类调用基类中的静态方法。请参阅下面的简化 Playground 代码。

调用非静态“转储”函数有效。 类似的静态调用失败。对数组进行类型转换的各种尝试也失败了。

在完整的生产代码中,“ClassA”位于第 3 方模块中,无法更改。它可以进一步子类化和扩展。

Swift 是否提供了一些神奇的类型转换来让 ClassT 直接调用 ClassA.dump()?

class ClassT<T> {

    var dict=[String:T]()

    func add(key:String, obj:T) {
        dict[key]=obj
        let arr=Array(dict.values)
        dump(arr) // works -> but not as expected, see comment below !!!
        ClassA.dump(arr) // error: cannot convert value of type 'Array<T>' to expected argument type '[ClassA]'
        ClassA.dump(arr as! [ClassA]) // error: cannot convert value of type 'Array<T>' to type '[ClassA]' in coercion
        ClassA.dump(arr as! [AnyObject]) // error: 'AnyObject' is not a subtype of 'T'
        ClassA.dump(arr as! [Any]) // error: 'Any' is not a subtype of 'T'
    }

}

class ClassA {

    func dump(arr:[ClassA]) {
        ClassA.dump(arr)
    }

    static func dump(arr:[ClassA]) {
        print(arr)
    }
}

class ClassB:ClassA {

    static let o=ClassT<ClassA>()

    func test() {
        ClassB.o.add("Elem1", obj:self)
    }
}

最佳答案

您必须添加一个约束来指定 T 派生自 ClassA

class ClassT<T: ClassA> {

    var dict = [String : T]()

    func add(key: String, obj: T) {
        dict[key] = obj
        let arr = Array(dict.values) //probably unecessary
        dump(arr) // works
        ClassA.dump(arr)
    }
    //...

没有它,编译器就无法强制所有符合类型 T 都可转换为 ClassA

关于swift - 如何从泛型类<T>调用基类上的静态方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37666917/

相关文章:

ios - iOS 上用于 AD 中介的 AdMob 自定义事件 (Swift)

ios google登录,如何获取用户图片网址?

ios - MLMultiArray 使用未声明的类型错误

json - 快速获取 Json 5

swift - 将日期组件(整数)转换为字符串

swift - 如何使用 AVAudioPlayerNode 播放 Assets 目录中的声音?

ios - 使用 segue 时,在初始化程序之前将数据传递到 View Controller 。 ( swift )

iOS 图像查看器或使用最小行间距的 Collection View (启用分页)预览与照片应用程序完全相同

ios - UIRefreshControl 闪烁自调整单元格

ios - 尝试在 Swift 中创建循环进度条