Optional变量初学者指南
蘋果三周前發(fā)布了Swift。 從那時起,我一直在閱讀Swift的官方指南,并在Xcode 6測試版中使用。 我開始喜歡Swift的簡單和語法。 與我的團(tuán)隊(duì)一起,我仍然在研究新的語言,并看看它與Objective-C(一種30歲的編程語言)相比如何。 同時,我們正在努力工作,看看我們?nèi)绾谓坛鯇W(xué)者,幫助社區(qū)輕松應(yīng)對Swift。
兩周前,我們介紹了Swift的基礎(chǔ)知識。 在接下來的幾周內(nèi),我們將編寫一系列教程,以涵蓋Swift中的許多新功能。 本周,我們先來看看Optional變量。
Optionals 概覽
我在上一篇文章中提到了可選項(xiàng),但沒有詳細(xì)介紹。 那么什么是可選項(xiàng)? 在Swift中聲明變量時,默認(rèn)情況下它們被指定為非可選項(xiàng)。 換句話說,您必須為變量分配非空值。 如果您嘗試將一個零值設(shè)置為非可選項(xiàng),編譯器會說:“你不能設(shè)置一個空值!”。
var message: String = "Swift is awesome!" // OK message = nil // compile-time error當(dāng)然,錯誤消息不是那么用戶友好,但它類似“__conversion’ that accepts the supplied arguments“。 同樣適用于在類中聲明屬性時。 默認(rèn)情況下,屬性被指定為非可選屬性。
class Messenger {var message1: String = "Swift is awesome!" // OKvar message2: String // compile-time error }您將收到message2的編譯時錯誤,因?yàn)樗鼪]有分配初始值。 對于來自O(shè)bjective-C的用戶,可能會有點(diǎn)驚訝。 在Objective-C中,在將nil分配給變量或聲明沒有初始值的屬性時,不會得到任何編譯時錯誤:
NSString *message = @"Objective-C will never die!"; message = nil;class Messenger {NSString *message1 = @"Objective will never die!";NSString *message2; }但是,這并不意味著您無法在Swift中分配初始值時聲明屬性。 Swift引入了可選類型來表示沒有值。 它是通過添加問號來定義的? 運(yùn)算符類型聲明后。 這是一個例子:
class Messenger {var message1: String = "Swift is awesome!" // OKvar message2: String? // OK }當(dāng)變量被定義為可選時,仍然可以賦值。 但是,如果變量象上面的代碼一樣沒有分配任何值,其值將自動默認(rèn)為nil。
為什么要用 Optionals?
?Swift是為安全而設(shè)計的。 正如蘋果所說,可選項(xiàng)是Swift是一種類型的安全語言的例子。 從上面的例子可以看出,Swift的可選項(xiàng)提供編譯時檢查,可以防止在運(yùn)行時發(fā)生一些常見的編程錯誤。 我們來看下面的例子,你將更好地了解可選項(xiàng)的功能。
在Objective-C中考慮以下方法:
- (NSString *)findStockCode:(NSString *)company {if ([company isEqualToString:@"Apple"]) {return @"AAPL";} else if ([company isEqualToString:@"Google"]) {return @"GOOG";}return nil; }您可以使用findStockCode:方法獲取特定上市公司的股票代碼。 為了演示目的,該方法只返回您的Apple和Google的股票代碼。 對于其他輸入,它返回空值。
假設(shè)該方法在同一個類中定義,我們使用它:
NSString *stockCode = [self findStockCode:@"Facebook"]; // nil is returned NSString *text = @"Stock Code - "; NSString *message = [text stringByAppendingString:stockCode]; // runtime error NSLog(@"%@", message);該代碼可以正確編譯,但是當(dāng)該方法對Facebook返回nil時,運(yùn)行該應(yīng)用程序會拋出運(yùn)行時異常。
使用Swift的可選項(xiàng),它會在編譯時顯示錯誤,而不是在運(yùn)行時發(fā)現(xiàn)錯誤。 如果我們在Swift中重寫上述示例,它將如下所示:
func findStockCode(company: String) -> String? {if (company == "Apple") {return "AAPL"} else if (company == "Google") {return "GOOG"}return nil }var stockCode:String? = findStockCode("Facebook") let text = "Stock Code - " let message = text + stockCode // compile-time error println(message)stockCode被定義為可選項(xiàng)。 這意味著它可以包含字符串或空值。 您無法執(zhí)行上述代碼,因?yàn)榫幾g器檢測到潛在錯誤(“可選類型String的值未展開”),并通知您進(jìn)行更正。
從示例中可以看出,Swift的可選功能加強(qiáng)了空值檢查,為開發(fā)人員提供了編譯時的指引。 顯然,使用可選項(xiàng)有助于更好的代碼質(zhì)量。
可選變量解包
那么我們該如何使代碼工作? 顯然,我們需要測試stockCode是否包含一個空值。 我們修改如下:
var stockCode:String? = findStockCode("Facebook") let text = "Stock Code - " if stockCode {let message = text + stockCode!println(message) }就像Objective-C對應(yīng)的,我們使用if來查看可選項(xiàng)是否包含一個值。 一旦我們知道可選項(xiàng)必須包含一個值,我們通過在可選名稱的末尾放置一個感嘆號(!)來解開它。 在Swift,這被稱為強(qiáng)制展開。 你用! 操作符打開可選項(xiàng)并顯示底層值。
參考上面的例子,我們只在nil-check之后解開“stockCode”可選項(xiàng)。 我們知道可選量必須包含非零值,然后才能使用! 操作符。 始終建議確??蛇x項(xiàng)在解開之前包含一個值。
但是如果我們忘記下面的驗(yàn)證怎么辦?
var stockCode:String? = findStockCode("Facebook") let text = "Stock Code - " let message = text + stockCode! // runtime error將不會有編譯時錯誤。 編譯器假定可選的包含一個值,因?yàn)槭褂昧藦?qiáng)制展開。 運(yùn)行應(yīng)用程序時,將拋出運(yùn)行時錯誤,并顯示以下消息:
fatal error: Can’t unwrap Optional.None
可選綁定
除了強(qiáng)制解包之外,可選綁定是一種更簡單和推薦的方式來打開可選的。 您使用可選綁定來檢查可選項(xiàng)是否包含值。 如果它包含一個值,將其解開并將其放入臨時常量或變量中。
沒有比使用示例更好的解釋可選綁定的方式。 我們將上一個示例中的示例代碼轉(zhuǎn)換為可選綁定:
var stockCode:String? = findStockCode("Facebook") let text = "Stock Code - " if let tempStockCode = stockCode {let message = text + tempStockCodeprintln(message) }“if let”(或“if var”)是可選綁定的兩個關(guān)鍵字。 通俗地,代碼說“如果stockCode包含一個值,將其解開,將其值設(shè)置為tempStockCode并執(zhí)行條件塊。 否則,只是跳過塊“。 由于tempStockCode是一個新的常量,您不再需要使用! 后綴訪問其值。
您可以通過評估if語句中的函數(shù)來進(jìn)一步簡化代碼:
let text = "Stock Code - " if var stockCode = findStockCode("Apple") {let message = text + stockCodeprintln(message) }這里的stockCode不是可選的,沒有必要使用! 后綴訪問條件塊中的值。 如果從函數(shù)返回nil值,則不會執(zhí)行該塊。
可選鏈
在解釋可選鏈接之前,讓我們稍微調(diào)整一下原來的例子。 我們創(chuàng)建一個名為Stock的新類,其代碼和價格屬性是可選的。 findStockCode函數(shù)被修改為返回Stock類而不是String。
class Stock {var code: String? var price: Double? }func findStockCode(company: String) -> Stock? {if (company == "Apple") {let aapl: Stock = Stock()aapl.code = "AAPL"aapl.price = 90.32return aapl} else if (company == "Google") {let goog: Stock = Stock()goog.code = "GOOG"goog.price = 556.36return goog}return nil }我們重寫原始示例如下。 我們首先通過調(diào)用findStockCode函數(shù)找到股票代碼/符號。 然后我們計算購買100股股票所需的總成本。
if let stock = findStockCode("Apple") {if let sharePrice = stock.price {let totalCost = sharePrice * 100println(totalCost)} }由于findStockCode()的返回值是可選的,我們使用可選綁定來檢查它是否包含實(shí)際值。 顯然,股票類的價格屬性是可選的。 我們再次使用“if let”語句來測試stock.price是否包含非零值。
上述代碼沒有任何錯誤。 您可以使用可選鏈接來簡化代碼,而不是編寫嵌套的“if set”。 該功能允許我們連接多個可選項(xiàng)與“?”操作符。 這是代碼的簡化版本:
if let sharePrice = findStockCode("Apple")?.price {let totalCost = sharePrice * 100println(totalCost) }可選鏈接提供了訪問價格價值的另一種方法。 該代碼現(xiàn)在看起來更清潔和更簡單。 這里我只是介紹可選鏈接的基礎(chǔ)知識。 您可以在Apple Swift指南中找到有關(guān)可選鏈接的更多信息。
Swift和Objective-C互操作性
Swift的可選功能非常強(qiáng)大,盡管可能需要一些時間來習(xí)慣語法。 可選項(xiàng)可以幫助您清楚代碼可以使用的值,并避免錯過無效。
Swift旨在與Objective-C API進(jìn)行交互。 每當(dāng)您需要與UIKit或其他框架API進(jìn)行交互時,您一定會遇到可選項(xiàng)。 以下是實(shí)現(xiàn)表視圖時遇到的一些可選項(xiàng):
func numberOfSectionsInTableView(tableView: UITableView?) -> Int {// Return the number of sections.return 1}func tableView(tableView: UITableView?, numberOfRowsInSection section: Int) -> Int {// Return the number of rows in the section.return recipes.count}func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCellcell.textLabel.text = recipes[indexPath.row]return cell}概要
了解可選項(xiàng)如何工作至關(guān)重要,這就是為什么我們將完整的文章用于可選項(xiàng)。 Swift中的可選項(xiàng)允許開發(fā)人員在編譯時發(fā)現(xiàn)潛在的問題,從而在運(yùn)行時防止意外的錯誤。 一旦你習(xí)慣了語法,你會欣賞可選的美麗。
和往常一樣,我們很樂意聽到您的反饋。 如果您對可選項(xiàng)有任何疑問或想分享您的想法,請隨時給我們留言。
轉(zhuǎn)載于:https://www.cnblogs.com/luoxs/p/6678828.html
總結(jié)
以上是生活随笔為你收集整理的Optional变量初学者指南的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【翻译】TCP backlog在Linu
- 下一篇: Python之路,day22-BBS基础