2015-03-24 195 views

回答

4

通過使用var contacts: [Person]!您實際上不初始化Person數組。

var contacts: [Person]! // contacts still nil 
var contacts = [Person]() // Person array with 0 objects 

如果使用(),而不是你初始化一個空Person陣列。在斯威夫特

0

操作:不聲明,其只是說該類型的變量是

算=是如在所有其他語言聲明操作者在這種情況下,隨後的(),它在此情況下宣佈一個新的人數組。

+0

「Operator = is ... a declaring operator」這個'='沒有聲明任何東西,它給lhs分配一個值,它是聲明的'var' – 2015-03-24 23:32:44

+0

這是真的,我需要練習我的術語 – Arbitur 2015-03-24 23:53:12

1

變量聲明採用以下格式:

var name: Type = initialValue 

也就是說,需要聲明一個名爲的一些Typename變量,並將其設置爲一個initialValue

雖然有很多簡寫形式,所以你會看到各種選擇。你最常看到的是離開Type部分。如果這樣做,那麼name的類型是從initialValue「推斷」的。

這就是var contacts = [Person]()正在發生的事情。該類型是PersonArray()正在調用初始化程序(即創建數組)。

或者,您可以聲明一個帶有類型的變量,但不會給它一個初始值。但編譯器不會讓你使用它,直到你保證將它設置爲初始值。因此,例如,您可以編寫var contacts: [Person],然後編寫contacts = [Person]()

當寫var contacts: [Person]!,具有!,你正在聲明Optional<[Person]>類型的變量 - 即,類型,它們可以是nil,或包含陣列。與常規數組不同,如果不初始化數組,則數組的可選項具有默認值值。默認值是nil - 也就是說,可選的不是包含一個數組。

!(而不是更常見的?)意味着它被聲明爲一種特殊的可選項,稱爲「隱式解包可選」 - 也就是說,當您以某種方式使用它時,就好像它不是可選。這樣做的一大缺點是它可以讓你使用它,就好像它不是可選的一樣。但如果你這樣做,它是nil然後你的程序將崩潰。因此,任何人使用contacts之前,它需要被初始化(如與contacts = [Person]()或指定某些現有陣列的話)

出於這個原因,最好不使用這些隱式展開自選除非是非常特殊的情況。他們有時看起來很方便,但他們通常不是最好的選擇,因爲他們很危險。

0

其他人提供了差異,我會給你什麼時候應該使用的情景。

var contacts: [Person]! //implicitly unwrapped optional. #1 
var contacts = [Person]() //array initialization. #2 

我使用#1,當我創建一個變量,它不會被它自己的類初始化。當我實現一個接收另一個控制器傳遞的信息的詳細視圖時,會出現這種情況。

對於#2,當您想要初始化一個新的空數組時使用。

相關問題