Почему свойство type не обновляется во время copyOnWrite - PullRequest
0 голосов
/ 02 июня 2018
struct Card: CustomStringConvertible {
    var identity:Int

    var description: String {
        return "card:\(identity)"
    }

    static var numberOfCards = 0

    init(identity:Int) {
        Card.numberOfCards += 1
        self.identity = identity
    }
}

var cards = [Card]()

let cardOne = Card(identity: 1)
var cardTwo = cardOne //card:1
Card.numberOfCards // 1
cardTwo.identity = 2 // card:2
Card.numberOfCards // 1

При копировании при записи новый объект не создается, пока мы не изменим скопированный объект.Почему значение numberOfCard остается тем же после того, как я изменил значение свойства cardTwo?

1 Ответ

0 голосов
/ 03 июня 2018

да!на самом деле мой вопрос кажется извращенным и бессмысленным, извините :( Я запутался, когда в конкретной ситуации (это не та ситуация :)) вам нужно реализовать функцию копирования при записи для вашего собственного типа данных, например, когда структурасодержат изменяемую ссылку, но все равно должны сохранять семантику значения

Возможно, приведенный ниже код мог бы объяснить, что я пытался сделать (хотя и бессмысленно :)), спасибо за ваш ответ;)

    class Identifier {

        static var instanceNumbers = 0

        var identity:Int

        init(identity:Int) {
            Identifier.instanceNumbers += 1
            self.identity = identity
        }
    }

    struct Card: CustomStringConvertible {

        private var _id:Identifier

        var id:Identifier {
            mutating get {
                if !isKnownUniquelyReferenced(&_id){
                    let identity = _id.identity
                    _id = Identifier(identity: identity)
                }
                return _id
            }
        }

        init(id:Identifier){
            self._id = id
        }

        var description: String {
            return "card:\(_id.identity)"
        }
    }

    let cardOne = Card(id: Identifier(identity: 1))
    let cardTwo = Card(id: Identifier(identity: 2))
    Identifier.instanceNumbers // 2
    var cardThree = cardTwo
    Identifier.instanceNumbers // 2
    cardThree.id.identity = 3
    Identifier.instanceNumbers // 3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...