Swift: уменьшить печатный объект, получил значение по умолчанию для переменной экземпляра? - PullRequest
0 голосов
/ 10 октября 2018

Я попытался сделать точную копию объекта подкласса UIView с пользовательской переменной экземпляра, сериализовав и десериализовав его.

Я присвоил значение переменной, отличное от значения по умолчанию, перед созданием копии.

Зачем мне возвращать значение по умолчанию для переменной экземпляра вместо того, которое я назначил?

См. Демонстрационный код ниже.

Спасибо!

class CustomUIView: UIView {
    var insVar = 5
}


extension UIView {
    func duplicate() -> UIView {
        let archive = NSKeyedArchiver.archivedData(withRootObject: self)
        return NSKeyedUnarchiver.unarchiveObject(with: archive) as! UIView
    }
}



let c1 = CustomUIView()
c1.insVar = 10

let c2 = c1.duplicate() as! CustomUIView

print(c1.insVar)  // get 10
print(c2.insVar)  // get 5

1 Ответ

0 голосов
/ 10 октября 2018

NSKeyedArchiver - это не какой-то магический инструмент, который находит все свойства в классе и сериализует их все.Он вызывает метод NSCoding, который выполняет тяжелую работу по сериализации.

Вы еще не переопределили init(coder:) или encode(with:).Вот почему ваша собственность не была заархивирована.

Я не особо рекомендую такой подход для создания точной копии UIView.UIView s - это просто средство отображения ваших данных (или модели), поэтому вам, вероятно, следует продублировать ваши данные и затем отобразить их с новым UIView.Вы можете написать такой метод:

func createView(thatDisplays data: SomeType) -> CustomUIView {
   // return a new CustomUIView here, configured to display that data...
}

// or as an initialiser:

init(dataToDisplay: SomeType) { ... }

И создать все свои CustomUIView таким образом.Тогда у вас будут почти одинаковые представления - единственное отличие - это отображаемые данные.Передача тех же данных этому методу - почти то же самое, что дублирование UIView не так ли?

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