ios - Swift:将 Foo<String> 转换为 Foo<Any>

标签 ios swift generics casting

这是我的代码

class Foo<T> {

}

class Main {
    static func test() {
        var foo: Foo<Any>

        var bar = Foo<String>()
        //Do all my stuff with foo necessitating String

        foo = bar
    }
}

当我尝试分配 foo = bar 时我收到错误 Cannot assign a value of type Foo<String> to a value of type Foo<Any> . 我不明白为什么会出现此错误,因为 String 符合 Any。 如果我做完全相同的事情但使用数组,我不会有任何错误

static func test() {
        var foo: Array<Any>

        var bar = Array<String>()
        //Do all my stuff with foo necessitating String

        foo = bar
    }

有人知道我的代码有什么问题吗? 谢谢

最佳答案

数组和字典是具有这种内置行为的特殊类型。但是,这不适用于自定义泛型类型。类型Foo<Any>不是 Foo<String> 的父类(super class)型(或本例中的父类(super class))尽管AnyString 的父类(super class)型.因此,您不能将这些类型的变量相互赋值。

根据您的具体情况,Swift Cast Generics Type 中概述的解决方案可能对你有用。当Foo包装类型为 T 的值您可以添加一个通用构造函数来转换来自 Foo 的不同类型实例的值.

class Foo<T> {
    var val: T

    init(val: T) {
        self.val = val
    }

    init<O>(other: Foo<O>) {
        self.val = other.val as! T
    }
}

class Main {
    static func test() {
        var foo: Foo<Any>

        var bar = Foo<String>(val: "abc")
        //Do all my stuff with foo necessitating String

        foo = Foo<Any>(other: bar)
    }
}

关于ios - Swift:将 Foo<String> 转换为 Foo<Any>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31923052/

相关文章:

swift - 使用 Swift,如何在我的应用程序终止之前安排本地通知?

java - 如何为接口(interface)的所有实现实现compareTo?

ios - Roboto 字体在 iOS 13 中的 iPhone XR 上无法使用

ios - 如何修改 SwiftUI 预览的 UIView 属性?

ios - ReactiveSwift 中运算符 '<~' 的使用不明确

ios - 如何以编程方式将 UISegmentedControl 添加到容器 View

ios - 滚动时禁用表格 View 重新加载

swift - 从 AppDelegate 更改 WebView url

java - 使用泛型的 Collector.toMap

.net - 为什么接口(interface)契约(Contract)不适用于装配外部?