簡體   English   中英

在swift中轉換為可選值

[英]Casting to an optional value in swift

我寫這篇文章的時候:

// json is of type AnyObject
var status : String? = json.valueForKeyPath("status") as String?

在編譯期間,Xcode似乎在無限循環中被阻塞: Xcode中

我的代碼中有什么問題嗎?

我做了一些測試,當我寫道:

var status : String? = json.valueForKeyPath("status") as? String

Xcode能夠編譯,但當valueForKeyPath返回nil時會出現什么行為。

你的第二個版本是正確的。 應該將可選值分配給可以返回nil的語句。 這是該行的流程:

  1. valueForKeyPath返回一個隱式解包的AnyObject( AnyObject! )可選項。 這意味着它可以是零或者它可以具有值。
  2. 嘗試將其轉換為String
  3. 如果無法將其轉換為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM