Swift 基础

关键字 nonmutating

2019-09-26  本文已影响0人  Ian_

作用是什么?
简单的说, 类无论标记为 let 还是 var, 只要它的属性是 var, 它的属性就是可以被修改的.
结构体与类有很大的不同, 一个不可变结构体对象, 没有特殊处理的情况下, 它的属性无论被标记为 let 还是 var 都不可以被修改.
下面就说一下特殊情况:
以下都是关于结构体说明的.
nonmutating 关键字, 表示在关键字修饰的方法中, 不会修改当前结构体的属性值,
结构体中的方法默认是 nonmutating, 结构体对象的 set 方法默认是 mutating 修饰, 因为 set 方法就是用来赋值的, 这很好理解.
如下代码实现, 一个 letTest 的结构体对象, 就可以进行 let t = Test() t.aa = "????"

struct Test {
    var aa: String {
        nonmutating set {  }
        get { "aa" }
    }
}

针对不可变结构体 let:
在被 nonmutating 修饰的方法内, 不可以给属性赋值.
如果这个属性的 setnonmutating 修饰, 则表示在这个 set 方法中, 不可以给属性赋值.
如下:

struct Test {
    var aa: String {
        nonmutating set {
            print(newValue)
            aaa = newValue        // 报错误 Cannot assign to property: 'self' is immutable
        }
        get { "aa" }
    }
    
    var aaa: String?
}

如果set 没被 nonmutating 修饰则

struct Test {
    var aa: String {
        set {
            print(newValue)
        }
        get { "aa" }
    }
}
let a = Test()
a.aa = "asdf"   // 报错误  Cannot assign to property: 'a' is a 'let' constant
上一篇 下一篇

猜你喜欢

热点阅读