【问题标题】:Assigning generic type to generic with AnyObject type使用 AnyObject 类型将泛型类型分配给泛型
【发布时间】:2016-03-01 10:44:35
【问题描述】:

我可以使用 Swift 的数组轻松做到这一点,而不会出现任何编译器错误:

let array: Array<AnyObject> = Array<String>()

但是当我尝试对我的自定义类型执行相同操作时,我得到编译器错误:

class Bar<T> { 
}

let bar: Bar<AnyObject> = Bar<String>()

错误是:

无法将“Bar”类型的值转换为指定类型 '栏'

如何使用自定义类型实现与原生 Swift 数组相同的行为?

【问题讨论】:

    标签: ios arrays swift generics


    【解决方案1】:

    首先,请注意您不能“轻松地”执行您的第一个任务,看似从[Any][String]:这看似有效的原因是您实际上正在初始化一个Any 元素的数组,带有 empty 数组(恰好是 [String] 类型)。如果您尝试使用包含实际元素的 [String] 数组来初始化您的 Any 数组,您将遇到运行时错误:

    let anyArr1: Array<Any> = Array<String>()   // = [], ok
    let anyArr2: Array<Any> = []                // ok
    
    let anyArr3: Array<Any> = [String](count: 2, repeatedValue: "foo")
        // = ["foo", "foo"], not ok
        /* fatal error: can't unsafeBitCast between types of different sizes */
    

    因此,您问题中的比较实际上没有意义。如果要在不同元素类型的两个数组实例之间进行类型转换,则需要一次执行一个元素,例如使用.map:

    let anyArr4: Array<Any> = [String](count: 2, repeatedValue: "foo").map{ $0 as Any }
    print(anyArr4)
        // prints "["foo", "foo"]", ok
    

    由于 Swift 是强类型的,Bar&lt;Any&gt;Bar&lt;String&gt; 本质上是两种不同的类型。如果你想一个一个地初始化,你必须为此定制你自己的初始化器,因为这两种不同类型之间的简单赋值或强制转换会失败。

    【讨论】:

    • 感谢您的回答。我用 AnyObject 而不是 Any 编辑了我的问题以避免混淆。在这种情况下,没有运行时错误,并且从字符串数组转换为 AnyObject 的数组不会失败。但是自定义类型仍然向我显示与问题中提到的相同的错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-12
    • 1970-01-01
    • 2018-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-22
    相关资源
    最近更新 更多