gpt4 book ai didi

ios - 将泛型类型分配给具有 AnyObject 类型的泛型

转载 作者:行者123 更新时间:2023-11-30 13:39:37 35 4
gpt4 key购买 nike

我可以使用 Swift 的数组轻松完成此操作,而不会出现任何编译器错误:

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

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

class Bar<T> { 
}

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

错误是:

Cannot convert value of type 'Bar< String>' to specified type 'Bar< AnyObject>'

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

最佳答案

首先,请注意,您无法“轻松”执行您的第一个任务,看似来自 [Any][String] :这看起来有效的原因是你实际上正在初始化一个 Any 的数组。具有 数组的元素(恰好是 [String] 类型)。如果您尝试初始化 Any带有 [String] 的数组保存实际元素的数组,您将遇到运行时错误:

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<Any>Bar<String>本质上是两种不同的类型。如果您想通过另一个来初始化,则必须为此目的自定义自己的初始化程序,因为这两种不同类型之间的简单赋值或转换将会失败。

关于ios - 将泛型类型分配给具有 AnyObject 类型的泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35720789/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com