从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,但后来真的不尊重那种类型?答案 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
,编译器也无法知道这一点,因此它无法知道如何解决操作员。