蘋果三周前發布了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「。 同樣適用於在類中宣告屬性時。 預設情況下,屬性被指定為非可選屬性。
classmessenger
您將收到message2的編譯時錯誤,因為它沒有分配初始值。 對於來自objective-c的使用者,可能會有點驚訝。 在objective-c中,在將nil分配給變數或宣告沒有初始值的屬性時,不會得到任何編譯時錯誤:
nsstring *message = @"objective-c will never die!";
message =nil;
class
messenger
但是,這並不意味著您無法在swift中分配初始值時宣告屬性。 swift引入了可選型別來表示沒有值。 它是通過新增問號來定義的? 運算子型別宣告後。 這是乙個例子:
classmessenger
當變數被定義為可選時,仍然可以賦值。 但是,如果變數象上面的**一樣沒有分配任何值,其值將自動預設為nil。
為什麼要用 optionals?
swift是為安全而設計的。 正如蘋果所說,可選項是swift是一種型別的安全語言的例子。 從上面的例子可以看出,swift的可選項提供編譯時檢查,可以防止在執行時發生一些常見的程式設計錯誤。 我們來看下面的例子,你將更好地了解可選項的功能。
在objective-c中考慮以下方法:
- (nsstring *)findstockcode:(nsstring *)companyelse
if ([company isequaltostring:@"
"])
return
nil;
}
假設該方法在同乙個類中定義,我們使用它:
nsstring *stockcode = [self findstockcode:@""]; //
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。
classstock
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?) ->intfunc 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...