2015-06-19 5 views
0

Как обеспечить, чтобы объекты, переданные в инициализатор, копировались, а не только устанавливали эти атрибуты позже?Атрибут Swift copy в инициализаторе

Использование @NSCopying, Apple говорит, что мы можем достичь copy -пособственного поведения. По умолчанию атрибут присваивается только, но не вызывает сеттер, который выполняет копирование.

Это потенциально опасно, поскольку я хочу полагаться на неизменное свойство и не изменять его, не зная. (подумайте о получении NSMutableString вместо NSString - копирование даст мне непреложный экземпляр).

+0

Я не думаю, что есть автоматическое решение, вам нужно скопировать NSString в метод init. Обратите внимание, что проблема не существует для строк Swift, которые являются * значениями типов *. –

ответ

0
  1. Используйте @NSCopying при объявлении собственности.
  2. Внутри инициализатора вызывается self.propertyname = newValue, так что сеттер вызывается и копируется.
  3. Чтобы узнать, когда значение изменяется извне класса, реализуйте «установленный» наблюдатель (который также требует также реализовать get).
+1

'self.propertyname = newValue' does * not * копирует объект при вызове * внутри инициализатора *. Я думаю, в этом и есть вопрос. –

+0

Он делает. Но вы должны называть это после super.init, который вы проверяете, хорошо или нет. – Tushar

+1

Проверьте это: http://swiftstub.com/203701077/. Если 'self.name = name' копирует строку, тогда вывод должен быть« foo », а не« foobar ». –

 Смежные вопросы

  • Нет связанных вопросов^_^