在我們使用objective-c表示字串資訊的時候,可以用下面方法書寫。
nsstring *str = @"lalala";
str = nil;
因為objective-c是弱型別語言,所以這裡的str既可以是具體的字串也可以是nil。但到了swift中就不可以了,因為swift是型別安全的語言,乙個string型別的變數不可能既能是具體的字串,又可以為nil(更嚴格的說string型別的內容只能是字串)。所以,在swift中有了可選型別的概念。(其實這一概念也是「借鑑」於其他程式語言,比如c#,只不過在c#中稱之為可空型別)
為swift是一門安全的程式語言. 正如蘋果所言, 可選型別就是證明swift是一門安全的程式語言的乙個小例子.swift的可選型別提供了在編譯階段就檢查一些可能在執行時才會出現的常見錯誤的機制. 下面通過下面的例子更好的詮釋一下可選型別的威力.
oc中
考慮下面乙個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 - ";
nslog(@"%@", message);
上面的**是可以編譯通過的, 但是因為傳入了」facebook」導致返回值是nil, 當**開始執行後, 程式就會報錯了.
swift中
當使用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
print(message)
解決方案:
1.硬解包
如何讓上面的**正常執行? 很明顯, 這裡需要判斷stockcode是否為空. **如下:
var stockcode:string? = findstockcode("facebook")
let text = "stock code - "
if stockcode
像在objective-c中一樣, 還是使用if來判斷stockcode中是否有值. 一旦確定stockcode中肯定有值時, 將乙個感嘆號(!)加在可選型別變數名後面來解包這個可選型別的變數. 在swift中, 這叫做硬解包. 即直接在可選型別後面加乙個感嘆號來表示它肯定有值.
缺點:
上面的例子中, 我們只是自己知道stockcode肯定有值, 所以才直接硬解包了stockcode變數. 但是萬一有時候我們的感覺是錯的, 那程式在執行時可能會出現嚴重的錯誤. 所以swift中是推薦先檢查可選型別是否有值, 然後再進行解包的!
var stockcode:string? = findstockcode("facebook")
let text = "stock code - "
let message = text + stockcode! // runtime error
以上**在編譯階段不會報錯.因為使用了硬解包, 編譯器認為可選型別是有值的, 所以編譯是通過的. 當**執行起來時, 知名的錯誤將會出現:fatal error: can』t unwrap optional.none
解決方案:使用可選繫結(optional binding)
與硬解包不同, 可選繫結(optional binding)是一種更簡單更推薦的方法來解包乙個可選型別. 使用可選繫結來檢查可選型別的變數有值還是沒值. 如果有值, 解包它並且將值傳遞給乙個常量或者變數.**如下:
var stockcode:string? = findstockcode("facebook")
let text = "stock code - "
iflet tempstockcode = stockcode
if let或者if var是可選繫結的兩個關鍵字. 使用自然語言來描述上面這段**的話, 意思就是如果stockcode有值,解包它,並且將它的值賦值給tempstockcode, 然後執行下面的條件語句; 如果stockcode為空, 直接跳過條件語句塊.
上面的**可以簡化如下:
let text = "stock code - "
if let message = text + stockcode
print(message)
}
Swift Optional 可選型的解包簡單使用
swift是嚴格的強型別語言 var errormessage string?adfa if let message errormessage else errormessage?uppercased 等價上面的if判斷 對可選型別的errormessage 進行解包 如果不為nil 就繼續執行 如...
Option可選值可選值(二)
playground noun a place where people can play import cocoa varstr1 供選鏈結和強制拆包的不同。class person class residence subscript i int room func printnumberofro...
python中非可選引數 Python可選引數
為了有效地使用預設值,您需要了解預設值是如何工作的。函式是物件。因此,它們具有屬性。所以,如果我建立這個函式 def f x,y return y 我建立了乙個物件。其特點如下 dir f call class closure code defaults delattr dict doc forma...