正如我在Swift中所知,数组是打字的。数组的项必须是相同的类型,如果你没有在初始化中写入数组类型,编译器将根据初始值推断它。
但我尝试使用不同的类型初始化数组,并且编译器没有给出任何错误,并且可以毫无问题地处理数组! 任何人都可以向我解释发生了什么事吗?
答案 0 :(得分:1)
由于Swift编译器非常智能,可以推导出最接近的数组初始值表达式的公共子类型,因此数组元素类型最终为NSObject
。
最终片段创建一个名为library的常量数组,其中包含两个Movie实例和三个Song实例。通过使用数组文字的内容初始化来推断库数组的类型。 Swift的类型检查器能够推断出Movie和Song有一个共同的超类MediaItem,因此它推断出一种类型的[MediaItem]用于库数组:
let library = [
Movie(name: "Casablanca", director: "Michael Curtiz"),
Song(name: "Blue Suede Shoes", artist: "Elvis Presley"),
Movie(name: "Citizen Kane", director: "Orson Welles"),
Song(name: "The One And Only", artist: "Chesney Hawkes"),
Song(name: "Never Gonna Give You Up", artist: "Rick Astley")
]