繁体   English   中英

隐式展开的可选使不可变

[英]Implicitly unwrapped optional made immutable

为什么无法对隐式解包的可选变量进行突变?

这是一个重现问题的简短示例:

带阵列

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

因为您尝试更改它们的方式是通过更改值(不可变的),而不是更改var

在Swift中,值类型是不可变的。 永远。

突变不是值的突变,而是包含值的变量的突变。

Int的情况下, +=运算符在左侧获得一个结构,在右侧获得一个Int,并且不能将结构添加到int。

Array的情况下, append是一个变异成员。 但是它是在不直接存储在变量中的不可变值上调用的。 它只能对直接存储在变量中的值进行操作(这就是使它们可变的事实:它们存储在变量中的事实。变量实际上并不是可变的)。

更新:

Xcode Beta 5中的一个小警告已解决此问题:

var list: [Int]! = [1]
list.append(10)

var number: Int! = 1
number! += 2
number += 2 // compile error

该数组可以正常工作,但是现在看来整数仍然需要显式拆包以允许使用+=


当前,这仅仅是Optionals的本质(无论是否隐式解包)。 unwrap运算符返回一个不变的值。 这可能是固定的,或者将来会提供更好的解决方案

目前唯一的解决方法是将数组包装在一个类中:

class IntArray {
    var elements : [Int]
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM