为什么我不能改变一个隐式解包的可选变量?
以下是重现问题的简短示例:
var list: [Int]! = [1]
list.append(10) // Error here
Immutable value of type '[Int]' only has mutating members named 'append'
var number: Int! = 1
number = 2
number = 2 + number
number += 2 // Error here
Could not find an overload for '+=' that accepts the supplied arguments
答案 0 :(得分:5)
因为你试图改变它们的方式是改变值(它们是不可变的)而不是改变var
。
在Swift中,值类型是不可变的。一直都是。
变异不是值的变异,它是包含该值的变量的变异。
对于Int
,+=
运算符在左侧获取结构,在右侧获取Int,并且不能向int添加结构。
在Array
的情况下,append
是变异成员。但它是在不直接存储在变量中的不可变值上调用的。它只能对直接存储在变量中的值进行操作(这使得它们变得可变:它们存储在变量中的事实。它们实际上不是可变的,变量是)。
答案 1 :(得分:4)
<强>更新强>
这已经在Xcode Beta 5中修复了一个小警告:
var list: [Int]! = [1]
list.append(10)
var number: Int! = 1
number! += 2
number += 2 // compile error
数组按预期工作,但现在似乎整数仍然需要显式展开以允许使用+=
目前,这只是Optionals的性质(无论是否隐式解包)。 unwrap运算符返回不可变值。 This is likely to be fixed or a better solution will be provided in the future
现在唯一的办法是将数组包装在一个类中:
class IntArray {
var elements : [Int]
}