这里每天共享一个 iOS 的新知识,快来关注我吧

前言

iOS:Non-mutating 关键字介绍

上次的文章中,咱们讲到了 mutating 这个关键字,其时提到的一切示例都是关于在办法中修正特点的,但 Swift 还供给了一种将某些上下文符号为非可变的办法。

mutating 的运用和实现原理

这个关键字是 nonmutating,用于符号值类型(枚举、结构体)中的办法。虽然实践的应用场景非常少,但在某些情况下它仍然是一个有用的功用。

nonmutating 的运用办法

nonmutating 关键字也是直接符号在办法名前面的,用来向编译器保证,在这个办法中并不会改动任何自身的特点:

struct Point {
    var x = 0.0, y = 0.0
    nonmutating func description() -> String {
        return "(\(x), \(y))"
    }
}

nonmutating 关键字符号在 description 办法上,表明咱们不会在 description 办法里对自身做出修正,不过……如同没什么用对吧?由于就算不加 nonmutating 关键字,程序一样会正常运转。

实践的应用场景

其实 nonmutating 关键字更多被用在核算特点(computed properties)的 set 办法上。

核算特点本质上是一种办法,能够经过 getset 来拜访和修正值。假如你想在 set 办法中改动其他特点而不改动该特点自身,你就能够运用 nonmutating set

举个比如,假如咱们有一个存储东西类叫 Storage,里面有个核算特点叫 userName,当获取 userName 时,从 UserDefault 中获取(get 办法),当设置 userName 时,把新值存储到 UserDefault 中(set 办法)。

struct Storage {
    private let userNameKey = "userNameKey"
    var userName: String? {
        get {
            return UserDefaults.standard.string(forKey: userNameKey)
        }
        set {
            UserDefaults.standard.set(newValue, forKey: userNameKey)
        }
    }
}

当咱们用 let 创立一个 Storage 时,设置 userName 发现报错了:

iOS:Non-mutating 关键字介绍

这有点反直觉,由于在整个 userNamegetset 过程中,都没有修正其自身或许特点,但很明显编译器并不能进一步剖析你的底层代码,而是简略粗暴的认为,只要有 set 办法,就认为你要做修正,因此报错。

想要修正这个报错,就需要用 nonmutating 关键字了,只需要在 set 办法前加上这个关键字,就能够正常运转了。

struct Storage {
...
        nonmutating  set {
            UserDefaults.standard.set(newValue, forKey: userNameKey)
        }
...
}

另外,在协议中也能够运用这个关键字:

protocol Storage {
    var userName: String? { get nonmutating set }
}

总结

经过这个关键字能够显式告知编译器该办法/拜访器不会改动其值,一起也为了代码的安全,编译器不会让你从 nonmutating 的办法中拜访该类型的任何可变成员。

期望经过本文能让你深入了解 nonmutating 关键字的用法和效果,虽然在实践开发过程中大概用不上,但知道一下总是好的。

这里每天共享一个 iOS 的新知识,快来关注我吧

本文同步自微信大众号 “iOS新知”,每天准时共享一个新知识,这里仅仅同步,想要及时学到就来关注我吧!