为什么我无法修改一个隐式解包可选变量?
以下是一个简短的示例,可重现此问题:
使用数组
var list: [Int]! = [1]
list.append(10) // Error here
类型为 '[Int]' 的不可变值仅具有名为 'append' 的可变成员
使用 Int
var number: Int! = 1
number = 2
number = 2 + number
number += 2 // Error here
找不到接受所提供参数的“+=”的重载
为什么我无法修改一个隐式解包可选变量?
以下是一个简短的示例,可重现此问题:
var list: [Int]! = [1]
list.append(10) // Error here
类型为 '[Int]' 的不可变值仅具有名为 'append' 的可变成员
var number: Int! = 1
number = 2
number = 2 + number
number += 2 // Error here
找不到接受所提供参数的“+=”的重载
更新:
这个问题在Xcode Beta 5中已经修复,但有一个小问题:
var list: [Int]! = [1]
list.append(10)
var number: Int! = 1
number! += 2
number += 2 // compile error
数组按预期工作,但现在整数仍需要显式解包才能使用 +=
目前,这只是可选项的本质(无论是否隐式解包)。解包操作符返回一个不可变值。未来可能会修复此问题或提供更好的解决方案。
现在唯一的解决办法是将数组封装在类中:
class IntArray {
var elements : [Int]
}
Optional
上使用它,而且它也无法解决问题,因为返回的值仍然是不可变的(因为所有值类型始终是不可变的)。 - Analog File
String
这样的值类型和像Int[]
这样的集合类型默认情况下是可变的,当赋值给变量时。只有当你将它们赋值给常量(即let
)时,它们才变成不可变的。请参考 文档。 - akashivskyyappend
调用失败的原因:它是一个数组的变异方法。它需要创建一个新数组并将其分配给一个变量,但只有在有一个包含数组的变量时才能这样做,而没有包含数组的变量。 - Analog File