将一系列枚举类型化为[Any]

时间:2015-02-03 18:27:35

标签: swift

当我尝试将一个枚举数组传递给接受[Any]的方法时,我收到一条警告,告诉我“'EnumType'与'Any'不相同”。如果我将EnumType[EnumType]传递给参数类型为Any的方法,则不会发出警告。有人可以对这里发生的事情有所了解吗?

1 个答案:

答案 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)获得相同的行为。