2015-09-25 38 views
0

此代碼來自Apple的新書。我的問題是:爲什麼「讓roomCount = john.residence?.numberOfRooms」是零,我認爲.numberOfRooms應該是1,但在xcode中它說的是零,我只是不明白爲什麼是零。如果任何人都可以澄清我這將是非常棒的。先謝謝你。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當你試圖與使用未初始化呢。

如果你想使用.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,我只是不明白爲什麼當該屬性的值爲1. – iloveios

3
let roomCount = john.residence?.numberOfRooms 
在此行

的roomCount都必須爲零,因爲你沒有設置居住實例變量。 當john.residence = Residance()後,roomCount不爲零。

歐凱所以

let roomCount = john.residence?.numberOfRooms 

是這樣

let roomCount: Int! = nil 

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

所以如果住宅是零,則roomCount正在零。

let roomCount = john.residence?.numberOfRooms 

因此,這將始終打印nil因爲residence什麼都沒有返回:

+0

感謝您的回答。但是如何獲得.numberOfRooms? – iloveios

+2

它無法訪問多少個房間。這是可選鏈接的一點。如果住所不是零,它只能訪問多少個房間。如果住所是零,那麼房間數量將爲零。如果你說'讓roomCount = john.residence!.numberOfRooms',你會得到一個意外發現的零運行異常 – Paulw11

2

在示例中,行let john = Person()創建了一個對象約翰類型

類型包括可選屬性居住var residence: Residence?

這裏居住因爲類型住宅尚未初始化。但一個可以訪問其屬性numberOfRooms甚至住所零(因爲這裏可選鏈接使用)和訪問它的結果,是零

let roomCount = john.residence?.numberOfRooms 

3:28 居住初始化和分配,

john.residence = Residence() 

現在,約翰。停留對象初始化和訪問其numberOfRooms時屬性,它返回默認分配值1

在迅速,性質是可選類型可訪問它們是否是零或不(初始化或不初始化)。

可選鏈接

可選鏈接是查詢和調用上的可選屬性,方法和標是目前可能是零的過程。如果可選包含一個值,則屬性,方法或下標調用會成功; 如果可選爲零,則屬性,方法或下標調用返回nil。多個查詢可以鏈接在一起,如果鏈中的任何鏈接都是零,整個鏈將優雅地失敗。

Find reference here