【问题标题】:Swift constant UIView never mutated warningSwift 常量 UIView 从不变异警告
【发布时间】:2016-04-18 15:58:36
【问题描述】:

我最近正在编写一些测试代码,构建愚蠢的视图层次结构,我遇到了一些让我眯起眼睛的代码。

var parentView: UIView = UIView()  //Warning here
parentView.addSubview(UIImageView())

第一行是以下警告:

变量“parentView”从未发生变异;考虑更改为“让”常量

我很困惑为什么这个元素没有发生突变,或者编译器为什么认为它没有发生突变。我想也许 Swift 正在检测对象中的一个集合正在发生变异,而不是对象本身的属性。这导致我尝试以下操作:

let strings: [String] = []
strings.append("Hi") //This is an error

鉴于上述代码,我能想到的唯一解释是某处存在错误。我是否在某处遗漏了使这种情况有意义的关键字?类似于 C++ 的“可变”关键字?

如果不是错误,我希望在一个不继承自 UIObject 的类中重新创建此场景,这样我就可以理解是什么原因造成的。

【问题讨论】:

    标签: ios swift


    【解决方案1】:

    这不是错误。对于类实例(它们是引用类型),例如你的UIView 实例,即使实例本身是一个常量,你也可以改变实例属性(let)。另一方面,数组在 Swift 中被视为值类型,并且是常量数组的成员(let arr ...)可能不会发生变异。

    因此,您永远不会真正改变 parentView 本身(parentView = UIView() 将是其自身的突变),只有它的成员,在这种情况下,将 parentView 标记为有意义(如编译器所述)一个常数。

    如果您创建结构的实例并将该实例分配给 常量,你不能修改实例的属性,即使它们 被声明为变量属性

    ...

    这种行为是由于结构是值类型。当一个实例 值类型的 被标记为常量,它的所有属性也是如此

    对于作为引用类型的类并非如此。如果你 将引用类型的实例分配给常量,你仍然可以 更改该实例的变量属性

    来自Language Guide - Properties

    ...

    实际上,在整个过程中,您一直在广泛使用值类型 前几章。事实上,Swift 中的所有基本类型——整数, 浮点数、布尔值、字符串、数组和字典——是 值类型,并在幕后作为结构实现

    所有结构和枚举在 Swift 中都是值类型。这意味着 您创建的任何结构和枚举实例以及任何值 它们作为属性的类型——在传递时总是被复制 在你的代码中。

    来自Language Guide - Classes and Structures

    【讨论】:

      猜你喜欢
      • 2017-08-17
      • 2017-09-27
      • 2015-12-18
      • 1970-01-01
      • 2014-01-17
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      相关资源
      最近更新 更多