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

时间:2014-06-16 04:00:07

标签: swift

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

e.g。

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

7 个答案:

答案 0 :(得分:19)

来自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


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

 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'

答案 1 :(得分:4)

要使用任意类型初始化数组,只需使用 var arbitraryArray = [Any]()

答案 2 :(得分:2)

AnyObject是一种类型,您可以创建一个包含这些类型的数组,(如类名所示)意味着它可以包含任何类型的对象。 NSArrays没有类型绑定,当您创建具有混合类型的数组时,它将生成NSArray而不是Array。但是,我不会依赖于此,因为它可能在将来发生变化(AnyObject []会自动与NSArray桥接。)

你可以在游乐场试试这个(注意:dynamicType返回&#34;(元节类型)&#34;我不知道如何拉出实际类型所以我依靠编译错误):

var x = [ 1, 2, "a" ]
x.dynamicType.description() // -> __NSArrayI

var y = [ 1, 2 ]
y.dynamicType.description() // -> Error: Array<Int>.Type does not have a member named 'description'.

var z: AnyObject[] = [ 1, 2, "a" ]
z.dynamicType.description() // -> Error: Array<AnyObject>.Type does not have a member named 'description'.

答案 3 :(得分:1)

描述正确,Array存储多个相同类型的值。关键是一个值有多种类型。也就是说,例如String类型为StringAny;类Ellipse : Shape的实例的类型为EllipseShapeAnyObjectAny

 14> class Foo {}
 15> class Bar : Foo {}
 16> var ar1 : Array<Any> = [1, "abc", Foo(), Bar()]
ar1: Any[] = size=4 {
  [0] = <read memory from 0x7fa68a4e67b0 failed (0 of 8 bytes read)>
  [1] = { ... }
  [2] = {}
  [3] = { ... }
}
 17> ar1[0]
$R5: Int = <read memory from 0x7fa68a51e3c0 failed (0 of 8 bytes read)>
 18> ar1[1]
$R6: String = { ... }
 19> ar1[2]
$R7: Foo = {}
 20> ar1[3]
$R8: Bar = {
  lldb_expr_14.Foo = {}
}
 21> ar1[0] as Int
$R9: Int = 1

答案 4 :(得分:1)

在Swift 3中,您可以使用:

var testArray = ["a",true,3,"b"] as [Any]

答案 5 :(得分:0)

相反,您也可以在类中使用结构:

struct Something {
        let a: String
        let b: String?
        let boolValue: Bool
        let value: Int

        init(a: String, b: String? = nil, boolValue: Bool, value: Int) {
            self.a = a
            self.b = b
            self.boolValue = boolValue
            self.value = value
        }
}

答案 6 :(得分:0)

在Swift 5上进行了测试

您可以将数据类型明确声明为任意。 Any类型代表任何类型的值。

类型转换

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

明确输入

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