Optional變數初學者指南

2022-07-13 23:00:42 字數 4873 閱讀 4721

蘋果三周前發布了swift。 從那時起,我一直在閱讀swift的官方指南,並在xcode 6測試版中使用。 我開始喜歡swift的簡單和語法。 與我的團隊一起,我仍然在研究新的語言,並看看它與objective-c(一種30歲的程式語言)相比如何。 同時,我們正在努力工作,看看我們如何教初學者,幫助社群輕鬆應對swift。

兩周前,我們介紹了swift的基礎知識。 在接下來的幾周內,我們將編寫一系列教程,以涵蓋swift中的許多新功能。 本週,我們先來看看optional變數。

optionals 概覽

var message: string = "

swift is awesome!"//

okmessage = nil //

compile-time error

當然,錯誤訊息不是那麼使用者友好,但它類似「__conversion』 that accepts the supplied arguments「。 同樣適用於在類中宣告屬性時。 預設情況下,屬性被指定為非可選屬性。

class

messenger

您將收到message2的編譯時錯誤,因為它沒有分配初始值。 對於來自objective-c的使用者,可能會有點驚訝。 在objective-c中,在將nil分配給變數或宣告沒有初始值的屬性時,不會得到任何編譯時錯誤:

nsstring *message = @"

objective-c will never die!";

message =nil;

class

messenger

但是,這並不意味著您無法在swift中分配初始值時宣告屬性。 swift引入了可選型別來表示沒有值。 它是通過新增問號來定義的? 運算子型別宣告後。 這是乙個例子:

class

messenger

當變數被定義為可選時,仍然可以賦值。 但是,如果變數象上面的**一樣沒有分配任何值,其值將自動預設為nil。

為什麼要用 optionals?

swift是為安全而設計的。 正如蘋果所說,可選項是swift是一種型別的安全語言的例子。 從上面的例子可以看出,swift的可選項提供編譯時檢查,可以防止在執行時發生一些常見的程式設計錯誤。 我們來看下面的例子,你將更好地了解可選項的功能。

在objective-c中考慮以下方法:

- (nsstring *)findstockcode:(nsstring *)company  

else

if ([company isequaltostring:@"

google

"])

return

nil;

}

假設該方法在同乙個類中定義,我們使用它:

nsstring *stockcode = [self findstockcode:@"

facebook

"]; //

nil is returned

nsstring *text = @"

stock code - ";

runtime error

nslog(@"

%@", message);

該**可以正確編譯,但是當該方法對facebook返回nil時,執行該應用程式會丟擲執行時異常。

使用swift的可選項,它會在編譯時顯示錯誤,而不是在執行時發現錯誤。 如果我們在swift中重寫上述示例,它將如下所示:

func findstockcode(company: string) -> string? 

else

if (company == "

google")

return

nil}

var stockcode:string? = findstockcode("

facebook")

let text = "

stock code -

"let message = text + stockcode //

compile-time error

println(message)

stockcode被定義為可選項。 這意味著它可以包含字串或空值。 您無法執行上述**,因為編譯器檢測到潛在錯誤(「可選型別string的值未展開」),並通知您進行更正。

從示例中可以看出,swift的可選功能加強了空值檢查,為開發人員提供了編譯時的指引。 顯然,使用可選項有助於更好的**質量。

可選變數解包

那麼我們該如何使**工作? 顯然,我們需要測試stockcode是否包含乙個空值。 我們修改如下:

var stockcode:string? = findstockcode("

facebook")

let text = "

stock code - "if

stockcode

就像objective-c對應的,我們使用if來檢視可選項是否包含乙個值。 一旦我們知道可選項必須包含乙個值,我們通過在可選名稱的末尾放置乙個感嘆號(!)來解開它。 在swift,這被稱為強制展開。 你用! 操作符開啟可選項並顯示底層值。

參考上面的例子,我們只在nil-check之後解開「stockcode」可選項。 我們知道可選量必須包含非零值,然後才能使用! 操作符。 始終建議確保可選項在解開之前包含乙個值。

但是如果我們忘記下面的驗證怎麼辦?

var stockcode:string? = findstockcode("

facebook")

let text = "

stock code -

"let message = text + stockcode! //

runtime error

將不會有編譯時錯誤。 編譯器假定可選的包含乙個值,因為使用了強制展開。 執行應用程式時,將丟擲執行時錯誤,並顯示以下訊息:

fatal error: can』t unwrap optional.none

可選繫結

除了強制解包之外,可選繫結是一種更簡單和推薦的方式來開啟可選的。 您使用可選繫結來檢查可選項是否包含值。 如果它包含乙個值,將其解開並將其放入臨時常量或變數中。

var stockcode:string? = findstockcode("

facebook")

let text = "

stock code -

"if let tempstockcode =stockcode

「if let」(或「if var」)是可選繫結的兩個關鍵字。 通俗地,**說「如果stockcode包含乙個值,將其解開,將其值設定為tempstockcode並執行條件塊。 否則,只是跳過塊「。 由於tempstockcode是乙個新的常量,您不再需要使用! 字尾訪問其值。

您可以通過評估if語句中的函式來進一步簡化**:

let text = "

stock code -

"if var stockcode = findstockcode("

")

這裡的stockcode不是可選的,沒有必要使用! 字尾訪問條件塊中的值。 如果從函式返回nil值,則不會執行該塊。

可選鏈

在解釋可選鏈結之前,讓我們稍微調整一下原來的例子。 我們建立乙個名為stock的新類,其**和**屬性是可選的。 findstockcode函式被修改為返回stock類而不是string。

class

stock

func findstockcode(company: string) -> stock?

else

if (company == "

google")

return

nil}

我們重寫原始示例如下。 我們首先通過呼叫findstockcode函式找到****/符號。 然後我們計算購買100股**所需的總成本。

if let stock = findstockcode("") 

}

由於findstockcode()的返回值是可選的,我們使用可選繫結來檢查它是否包含實際值。 顯然,**類的**屬性是可選的。 我們再次使用「if let」語句來測試stock.price是否包含非零值。

if let shareprice = findstockcode("

")?.price

swift和objective-c互操作性

swift的可選功能非常強大,儘管可能需要一些時間來習慣語法。 可選項可以幫助您清楚**可以使用的值,並避免錯過無效。

swift旨在與objective-c api進行互動。 每當您需要與uikit或其他框架api進行互動時,您一定會遇到可選項。 以下是實現表檢視時遇到的一些可選項:

func numberofsectionsintableview(tableview: uitableview?) ->int 

func tableview(tableview: uitableview?, numberofrowsinsection section: int) ->int

func tableview(tableview: uitableview!, cellforrowatindexpath indexpath: nsindexpath!) -> uitableviewcell!

概要了解可選項如何工作至關重要,這就是為什麼我們將完整的文章用於可選項。 swift中的可選項允許開發人員在編譯時發現潛在的問題,從而在執行時防止意外的錯誤。 一旦你習慣了語法,你會欣賞可選的美麗。

初學者mysql MySQL初學者使用指南

有很多朋友雖然安裝好了mysql但卻不知如何使用它。在這篇文章中我們就從連線mysql 修改密碼 增加使用者等方面來學習一些mysql的常用命令。一 連線mysql。1 例1 連線到本機上的mysql。首先在開啟dos視窗,然後進入目錄 mysqlbin,再鍵入命令mysql uroot p,回車後...

DLL初學者指南

這裡有兩個方法來載入乙個dll 乙個方法是捷徑另乙個則相比要複雜些。捷徑是只鏈結到你.lib 檔案並將.dll檔案置入你的新專案的路徑中去。因此,建立乙個新的空的win32控制台專案並新增乙個原始檔。將你做的dll放入你的新專案相同的目錄下。include include declspec dlli...

DLL初學者指南

dll初學者指南 dll project的源 及測試專案 原文出處 codeguru 我正在學習dlls,談不上對其有什麼高屋建瓴的見解 本文只是 通過 編碼讓你看到並想知道 是如何執行的。在本文中,我假定你知道如何使用你的編譯器特性,比如設定目錄路徑等等。ifndef dll tutorial h...