2015-09-25 2 views
0

Этот код из новой книги от Apple. Мой вопрос: «Как получилось» let RoomCount = john.residence? .NumberOfRooms »- это нуль, я думал, что .numberOfRooms должно быть 1, но в xcode он говорит, что nil я просто не понимаю, почему это nil. Если кто-нибудь может разъяснить мне это, это было бы потрясающе. Заранее спасибо.Swift Дополнительная цепочка

class Person { 
    var residence: Residence? 
} 

class Residence { 
    var numberOfRooms = 1 
} 

let john = Person() 

let roomCount = john.residence?.numberOfRooms 

john.residence = Residence() 

john.residence?.numberOfRooms 


if let roomCount = john.residence?.numberOfRooms { 
    print("John's residence has \(roomCount) room(s).") 
} else { 
    print("Unable to retrieve the number of rooms.") 
} 

ответ

2

residence еще не инициализирована, когда вы пытаетесь использовать его:

let roomCount = john.residence?.numberOfRooms 

Так что это всегда будет печатать nil потому residence нечего возвращаться.

Если вы хотите использовать .numberOfRooms первый инициализирует свой residence экземпляр и использовать его таким образом:

let john = Person() 
john.residence = Residence() 
let roomCount = john.residence?.numberOfRooms // 1 

Еще один способ сделать это инициализирует его в Person класс:

class Person { 
    var residence = Residence() 
} 

сейчас вы можете использовать .numberOfRooms следующим образом:

let john = Person() 
let roomCount = john.residence.numberOfRooms // 1 
+0

Спасибо за ваш ответ. Но как получилось, когда я набираю «let roomCount = john.residence? .NumberOfRooms» У меня есть доступ к .numberOfRooms, а не к присваиваемому мне значению 1. Извините, я смущен. Я просто не понимаю. – iloveios

+0

потому что 'numberOfRooms' является свойством класса 'Residence', поэтому вы можете получить к нему доступ с' .' –

+0

Да, но это свойство имеет значение 1, и я просто не понимаю, почему nil, когда это свойство имеет значение 1. – iloveios

3
let roomCount = john.residence?.numberOfRooms 

в этой линии roomCount должен быть нулевым, потому что вы не установили переменную экземпляра жительства. roomCount не ноль, когда он приходит после john.residence = Residance().

Окей так

let roomCount = john.residence?.numberOfRooms 

подобно этому

let roomCount: Int! = nil 

if let unwrappedResidence = john.residence 
{ 
    roomCount = unwrappedResidence.numberOfRooms 
} 

Так что если место жительства является ноль, то roomCount в настоящее время равна нулю.

+0

Спасибо за ответ. Но как получилось, что он имеет доступ к .numberOfRooms? – iloveios

+2

У этого нет доступа к количеству номеров. Это точка необязательной цепочки. Он имеет доступ только к числу номеров, если проживание не ноль. Если место проживания равно нулю, количество комнат будет равным нулю. Если вы сказали «let roomCount = john.residence! .NumberOfRooms», вы получите неожиданно обнаруженное исключение из-за отсутствия времени. – Paulw11

2

В данном примере линия let john = Person() создает объект john тип Человек.

Человек типа состоят из дополнительного имущества жительства т.е. var residence: Residence?

Здесь место жительства является нулю, потому что Тип Residence еще не инициализирован. Но можно получить доступ к его собственности numberOfRooms даже жительства является ноль (потому что здесь Дополнительный Chaining используется) и результат доступа к нему, равна нулю

let roomCount = john.residence?.numberOfRooms 

После когда резиденция инициализируется и назначен,

john.residence = Residence() 

john.Резиденция инициализацию объекта и при доступе к его numberOfRooms свойства, она возвращает по умолчанию присвоенного значения 1.

В быстры, свойства доступны для дополнительных типов, являются ли они нолем или нет (инициализируются или не инициализирован).

Дополнительный Chaining

Дополнительное сцепление представляет собой процесс для запроса и вызова свойств, методов и подстрочный на необязательное, что может в настоящее время быть нулевым. Если необязательное значение содержит значение, выполняется вызов свойства, метода или индекса. , если необязательный параметр равен нулю, свойство, метод или индексный вызов возвращает nil. Несколько запросов могут быть соединены вместе, и вся цепочка изящно выходит из строя, если какая-либо ссылка в цепочке равна нулю.

Find reference here

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