2017-10-21 88 views
-3

我想有一個數組作爲我的表視圖控制器的成員。該數組將成爲數據源。作爲視圖控制器的成員變量這些數組之間的差異

具有成員變量數組的下列方式有什麼區別或優點/缺點?

class BinViewController: UITableViewController, WKNavigationDelegate { 
    var peopleArray1 = [String]() 
    var peopleArray2: [String] = [] 
    var peopleArray3: [String]! 
    var peopleArray4: [String]? 
+4

這是一個關於Swift和屬性聲明和初始化的基本問題。你讀過Swift書嗎?你對這四行代碼有哪些具體問題?你不瞭解他們的差異究竟是什麼?請澄清你的問題(不要發表評論)。 – rmaddy

回答

1

這兩個基本上做的是同一件事:

var peopleArray1 = [String]() 
var peopleArray2: [String] = [] 

他們聲明和初始化[String]類型的空數組。


這兩個在另一方面,也都差不多:

var peopleArray3: [String]! 
var peopleArray4: [String]? 

對他們倆的陣列本身可能是nil,他們目前是它們被聲明。

區別在於peopleArray3是一個隱式解包的可選字符串數組,而peopleArray4是一個可選的字符串數組。

這對於peopleArray3意味着什麼,是你告訴編譯器,你將在它使用之前爲它設置一個值。如果您嘗試訪問它的值爲nil,則該應用程序將崩潰。

對於peopleArray4,你告訴編譯器,這個陣列可能nil在任何時間,所以你需要檢查,如果peopleArray4不是nil你訪問它。

1

我認爲沒有你需要問自己的正確問題。沒有優點或缺點。有許多方法可以根據你需要的和你想要實現的邏輯來初始化一個類的成員。

  • var peopleArray1 = [String]()你說的是編譯器,請讓我創建一個空字符串數組。 它被聲明和初始化。同樣你讓編譯器推斷你的數組類型與第二條語句相比。

  • var peopleArray2: [String] = []它和你的第一個陳述有99%的相同之處。你正在創建一個空的String數組。宣佈並初始化。這裏唯一的區別是你指定數組的類型。你不要讓編譯器推斷你的數組的類型。 var variable:TypeVariable = ...我們建議由蘋果讓編譯器推斷出你的成員變量的類型時,你可以因爲你贏得了可讀的代碼

  • var peopleArray3: [String]!它比以前的2個初始化相當不同。首先,你需要知道Swift是一種非常強類型的語言,你需要在使用它之前初始化每個變量。你可以嘗試的一件事是嘗試做出沒有!要麼 ?你的編譯器會提出一個問題警告你。有時你只是不知道什麼是初始價值,但你在某個時刻就會知道,你會有價值。一個變量是這兩種可能的狀態:沒有值或值被稱爲選項。有了這個聲明,你說我想創建一個可能爲零或可能有一些字符串值的字符串數組。如果你打印你的數組,你會有一個消息,如「可選([String])」。要獲得「可選」的值,只有當您確定自己的值爲時,才需要用感嘆號解開它。如果沒有,你的程序將會崩潰。在這個初始化過程中,您要求編譯器不要擔心,因爲您知道將來您的陣列將具有一些值。

  • var peopleArray4: [String]?與前一個相同。主要的區別是,每次你想訪問peopleArray的價值時,你需要用一個感嘆號來打開他的價值。 只有使用可選項的邏輯沒有優勢/劣勢。如果你的數組可能是零和進一步有值或是一個靜態數組...