2017-02-09 4 views
0

Есть ли лучший способ установить все свойства struct в nil, чем вручную, задав все свойства nil?Swift 3: Как установить все свойства struct в nil

Если у меня есть Привет-структура

struct Hello { 
    var salutation: String? 
    var name: String? 

} 

let hello = Hello(salutation: "Mr.", name: "James") 

В настоящее время я делаю это, чтобы сбросить значение:

func removeAll() { 
    salutation = nil 
    name = nil 
} 

Я вроде найти лучший способ, особенно когда структура является большой.

Я вижу некоторые рекомендации, чтобы использовать зеркало, но я получил сообщение об ошибке «Не удается присвоить свойству:„$ 0“неизменна»

func removeAll() { 

     let mirror = Mirror(reflecting: self) 

     let properties = mirror.children.flatMap { $0.value = nil } 
    } 

Спасибо за помощь!

ответ

0

Замените экземпляр структуры на новый. Пример:

var hello = Hello(salutation: "Mr.", name: "James") 
// ... use it for a while ... 
hello = Hello() // bingo! 

Все дополнительные свойства теперь сбрасываются до nil.

Вы даже позволили сделать это с в Здравствуйте, заменив self чистой копией:

struct Hello { 
    var salutation: String? 
    var name: String? 
    mutating func removeAll() { 
     self = Hello() 
    } 
} 

var hello = Hello(salutation: "Mr.", name: "James") 
// ... use it for a while ... 
hello.removeAll() // bingo 
+0

Привет Мэтт, на детской площадке, это хорошо, но в Xcode, я получил предупреждение: 'Значение факультативных Тип Привет? не разворачивается; вы хотели использовать! или? ' Можно ли использовать '!' Вот? Я добавил мутирующую функцию так же, как ваш пример. – Vina

+0

Я не знаю, как выглядит ваш код «внутри Xcode». Уверяю вас, что ничего не сказано о том, что я сказал, что приведет к «необязательному типу' Hello? », Поэтому это должно быть какое-то осложнение, которое вы сами добавили. – matt

+0

Извините, только что поняли, у меня есть функция init?() ... – Vina

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