2016-01-18 3 views
2

В Objective-C Я могу очень легко добавить свойство к .h файл ...Swift пусть свойство устанавливается через prepareForSegue

@property (nonatomic, strong) Person *person; 

, а затем установить это свойство во время prepareForSegue:withIdentifier:. В этом примере класс контроллера вида PersonViewController. Он предназначен для отображения информации об определенном объекте Person. Ему нужен объект Person, чтобы отобразить что-либо, и объект Person не изменится. Чтобы отобразить другого человека, который потребует и поп и нажмите на другой экземпляр PersonViewController.

Это, мне бы предположить, что в Swift свойство person должно быть определено как так ...

let person: Person 

кроме этого не может быть. Если я установил его таким образом, то он должен быть инициализирован до конца метода init ... Но нет никакого способа сделать это, поскольку он создается экземпляром Storyboard.

Так что я мог бы сделать это ...

var person: Person? 

за исключением, что это неправильно. PersonViewController не будет работать без person, поэтому сделать его необязательным не имеет смысла и делает его var не имеет смысла, так как person не изменится.

В дополнение к этому я должен добавить ...

guard let person = person else {return} 

для каждой функции, когда мне нужно использовать person объект.

я мог бы сделать это таким образом ...

var person = Person() 

, но это чувствует Hacky и расточительно. Каждый раз, когда я создаю контроллер представления, я теперь создаю, а затем выброшу Person. Это также var, который не имеет смысла в контексте контроллера вида.

Каков наилучший способ выполнить эквивалентную передачу в свойство во время segue, где свойство не является необязательным, не var и не создано во время init?

ответ

5

Я считаю, что лучший способ сделать это, это объявить его как:

var person: Person! 

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

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

+0

А, ок. Это разумно, я думаю. Жаль, но это все равно должно быть «var». Спасибо – Fogmeister

+1

Это лучший подход, но до сих пор не решает проблему @Fogmeister, это может быть интересный подход к предложению, потому что на самом деле не существует чего-то, чтобы имитировать это поведение –