Можно ли исключить определенное свойство (например, тип класса) от копирования во время копирования структуры? - PullRequest
2 голосов
/ 07 июля 2019

У меня есть следующая структура, которая содержит класс.

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 во время копирования структуры?

1 Ответ

1 голос
/ 08 июля 2019

Ваше решение не завершено.Вот полное и правильное решение.

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
}

Вам необходимо очищать кеш каждый раз, когда изменяется тело.Как только вы это сделаете, не будет иметь значения, если объект является общим для структур.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...