关于Array <any>和Array <int>的困惑

时间:2017-09-12 16:10:27

标签: swift3

从Swift3开始,我对以下内容感到困惑:

var o1:Array<Any> = [1,2,3]
var o2:Array<Int> = [1,2,3]

print(type(of:o2))
print(type(of:o2[0]))
o2[0] += 1
print(o2[0])

print(type(of:o1))
print(type(of:o1[0]))
//o1[0] += 1
print(o1[0])

编译并运行,我得到:

Array<Int>
Int
2
Array<Any>
Int
1

如果我取消注释该行,我得到一个编译错误“二进制运算符+ =不能应用于Any和Int类型的操作数”

好吧,所以似乎Swift认识到o1 [0]是一个Int,但我不能+ =它,但可以在o2 [0]上做到。这里有任何见解,为什么Swift说这个类型是Int,但后来真的不尊重那种类型?

1 个答案:

答案 0 :(得分:1)

  好的,所以似乎Swift认识到o1 [0]是一个Int,但我可以&#t; t + =它,但是可以在o2 [0]上做到。

不是这样。 Swift编译器将o1[0]视为Any,而不是Int。这就是你得到错误的原因;当您撰写o1[0] += 1时,您要求Swift在+=Any)和Int(o1[0])上使用1运算符,并且Swift没有任何带有这两个参数的+=运算符的定义。由于运算符在编译时被解析,这意味着即使该值在运行时实际上是Int,编译器也无法知道这一点,因此它无法知道如何解决操作员。