首页 > 解决方案 > 是否可以在结构复制期间排除某些属性(如类类型)被复制?

问题描述

我有以下结构,其中包含类。

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在结构复制期间排除被复制?

标签: swift

解决方案


您的解决方案不完整。这是一个完整且正确的解决方案。

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
}

每次修改正文时都需要清除缓存。一旦你这样做了,对象是否在结构之间共享就无关紧要了。


推荐阅读