这里每天共享一个 iOS 的新知识,快来关注我吧
前言
上次的文章中,咱们讲到了 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
办法上。
核算特点本质上是一种办法,能够经过 get
和 set
来拜访和修正值。假如你想在 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
发现报错了:
这有点反直觉,由于在整个 userName
的 get
和 set
过程中,都没有修正其自身或许特点,但很明显编译器并不能进一步剖析你的底层代码,而是简略粗暴的认为,只要有 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新知”,每天准时共享一个新知识,这里仅仅同步,想要及时学到就来关注我吧!