当我尝试将一个枚举数组传递给接受[Any]
的方法时,我收到一条警告,告诉我“'EnumType'与'Any'不相同”。如果我将EnumType
或[EnumType]
传递给参数类型为Any
的方法,则不会发出警告。有人可以对这里发生的事情有所了解吗?
答案 0 :(得分:1)
当您将一个类型作为参数传递给一个带有Any
的函数时,编译器会默默地为您进行转换 - 如果您有f(a: Any)
并且您调用了f(x)
,那么& #39;有点像编译器为你编写f(x as Any)
。
但是创建一个数组有点复杂,包括迭代整个数组逐个转换内容,编译器不会自动执行此操作。
很幸运,手工操作很容易:
// some function that just takes an array of Any and prints them
func takeAnys(anys: [Any]) {
",".join(anys.map(toString))
}
let ints: [Int] = [1,2,3]
// won't compile
takeAnys(ints)
// this iterates over each entry and converts it to Any,
// returning a new array of them
takeAnys(ints.map { $0 as Any })
注意,将[EnumType]
传递给采用Any
的函数与将数组传递到采用[Any]
的函数略有不同。前者有效,因为Any
可以容纳任何东西,包括一个数组,所以你得到[EnumType] as Any
这很好。但是你的函数需要Any
的数组,即一个内容转换为Any
的数组,而不是一个自身已转换为{{1}的数组}}
值得注意的是,此功能适用于类 - 如果您有一个子类数组,可以将其传递给一个带有超类数组的函数。但这是特定于引用类型的,您不能使用枚举或结构(或它们的协议,Any
)获得相同的行为。