一尘不染

在Swift中将不同类型的值存储在Array中

swift

在Swift编程语言中,它说“一个数组在一个有序列表中存储相同类型的多个值”。但是我发现您可以在数组中存储多种类型的值。描述不正确吗?

例如

var test = ["a", "b", true, "hi", 1]

阅读 284

收藏
2020-07-07

共1个答案

一尘不染

来自REPL

 xcrun swift
  1> import Foundation
  2> var test = ["a", "b", true, "hi", 1]
test: __NSArrayI = @"5 objects" {
  [0] = "a"
  [1] = "b"
  [2] =
  [3] = "hi"
  [4] = (long)1
}
  3>

您可以看到的testNSArray,这是AnyObject[]NSObject[]

发生的事情是Foundation提供了将数字和布尔值转换为的能力NSNumber。需要编译代码时,编译器将执行转换。

因此,它们现在具有的通用类型,NSObject因此可以推断为NSArray


没有,您的代码将无法在REPL中编译import Foundation

 var test = ["a", "b", true, "hi", 1]
<REPL>:1:12: error: cannot convert the expression's type 'Array' to type 'ArrayLiteralConvertible'

 var test:Array = ["a", "b", true, "hi", 1]
<REPL>:4:18: error: cannot convert the expression's type 'Array' to type 'ExtendedGraphemeClusterLiteralConvertible'

但是你可以做到

var test : Any[] = ["a", "b", true, "hi", 1]

因为它们具有通用类型,即Any


注意:AnyObject[]不能使用import Foundation

var test:AnyObject[] = ["a", "b", true, "hi", 1]
<REPL>:2:24: error: type 'Bool' does not conform to protocol 'AnyObject'
2020-07-07