swift - 是否可以在结构复制期间排除某些属性(如类类型)被复制?
问题描述
我有以下结构,其中包含类。
import Foundation
func generateRichText(body: String?) -> NSMutableAttributedString? {
if body == nil {
return nil
}
// TODO: Some complex logic to decorate body string will be added soon...
let myAttrString = NSMutableAttributedString(string: body!)
return myAttrString
}
struct Note {
var body: String?
// Technique described in https://stackoverflow.com/a/25073176/72437
var bodyAsRichText: NSMutableAttributedString? {
mutating get {
if (cachedBodyAsRichText == nil) {
cachedBodyAsRichText = generateRichText(body: body)
}
return cachedBodyAsRichText
}
}
// TODO: This is a class. I don't want it to be copied over during struct copy.
// If it is copied during struct copy, both struct will be sharing the same
// class instance.
private var cachedBodyAsRichText: NSMutableAttributedString?
}
var note = Note()
note.body = "hello"
print("note.bodyAsRichText = \(Unmanaged.passUnretained(note.bodyAsRichText!).toOpaque())")
var note_copy = note
print("note_copy.bodyAsRichText = \(Unmanaged.passUnretained(note_copy.bodyAsRichText!).toOpaque())")
对于上面的代码,输出将是
note.bodyAsRichText = 0x000055c035cfce70
note_copy.bodyAsRichText = 0x000055c035cfce70
我想要的输出是,不同的结构实例,应该有自己的类实例(cachedBodyAsRichText
)
因此,有没有办法cachedBodyAsRichText
在结构复制期间排除被复制?
解决方案
您的解决方案不完整。这是一个完整且正确的解决方案。
struct Note {
var body: String = "" {
didSet {
cachedBodyAsRichText = nil
}
}
var bodyAsRichText: NSAttributedString {
mutating get {
if (cachedBodyAsRichText == nil) {
cachedBodyAsRichText = generateRichText(body: body)
}
return cachedBodyAsRichText!.copy() as! NSAttributedString
}
}
private var cachedBodyAsRichText: NSAttributedString? = nil
}
每次修改正文时都需要清除缓存。一旦你这样做了,对象是否在结构之间共享就无关紧要了。
推荐阅读
- javascript - Firebase Firestore 不允许我通过 Cloud Function 将新字符串保存到数组
- c - 如何在不使用数组的情况下验证输入格式,例如输入“OIL2932”
- python - 如何在conda中创建环境?
- javascript - 为什么我的全局变量在发布请求后没有覆盖
- python - 如何更改 Python FTP 中的目录?
- shell - 如何从文件夹中随机选择文件重命名并将其复制到新文件夹
- javascript - React 中的状态突变 - 需要解释
- r - 带有数据表的数据栏
- flutter - 使用用户的实时位置颤动更新折线路线
- python - 猴子修补 PyCharm 函数