作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我尝试将枚举数组传递给接受[Any]
的方法时,我收到一条警告,告诉我“'EnumType' 与'Any' 不同”。如果我将 EnumType
或 [EnumType]
传递给参数类型为 Any
的方法,则不会出现警告。有人可以阐明这里发生了什么吗?
最佳答案
当你将一个类型作为参数传递给一个接受 Any
的函数时,编译器会默默地为你做一个转换——如果你有 f(a: Any)
然后你调用 f(x)
,这有点像编译器为你编写 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
的array,也就是说,一个内容转换为 Any
的数组,而不是一个本身已经被转换的数组转换为 Any
。
值得注意的是,此功能确实适用于类——如果您有一个子类数组,您可以将它传递给一个接受父类(super class)数组的函数。但这是特定于引用类型的,您无法使用枚举或结构(或它们的协议(protocol),Any
是什么)获得相同的行为。
关于swift - 将枚举数组类型转换为 [Any],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28306130/
我是一名优秀的程序员,十分优秀!