[英]Casting to an optional value in swift
我寫這篇文章的時候:
// json is of type AnyObject
var status : String? = json.valueForKeyPath("status") as String?
在編譯期間,Xcode似乎在無限循環中被阻塞:
我的代碼中有什么問題嗎?
我做了一些測試,當我寫道:
var status : String? = json.valueForKeyPath("status") as? String
Xcode能夠編譯,但當valueForKeyPath
返回nil
時會出現什么行為。
你的第二個版本是正確的。 應該將可選值分配給可以返回nil的語句。 這是該行的流程:
AnyObject!
)可選項。 這意味着它可以是零或者它可以具有值。 String
String
,則返回nil
使status
nil
。 如果它確實是一個非nil String
返回,則返回任何字符串的status
正如文件所說:
由於向下轉換可能會失敗,因此類型轉換運算符有兩種不同的形式。 可選形式為?,返回您嘗試向下轉換的類型的可選值。
摘錄自:Apple Inc.“The Swift Programming Language。”iBooks。 https://itun.es/au/jEUH0.l
這意味着當你寫作as? String
as? String
,返回值會自動包裝在一個可選項中,所以由此產生的實際類型是String?
,這是你想要的行為,所以你的第二個選擇是正確的。
在第一個示例中,您嘗試轉換valueForKeyPath
返回的值,該值為AnyObject!
類型AnyObject!
( !
表示隱式解包), String?
,這是明確包裝的,並且這個值不會自動包裝在一個可選項中,因此,由於這些類型不相同,因此它們之間的轉換可能不起作用。
TL; DR :你的第一個選項實際上是不正確的(盡管它不會使編譯器崩潰,這是一個錯誤),你的第二個選項是正確的,並做你想要的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.