2014-06-13 66 views
2

一個可選值當我寫這篇:鑄造在迅速

// 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

+0

'json'是什麼類型?你爲什麼指定'AnyObject'? – zaph

+0

考慮到Swift是一個早期的測試版,希望它有bug。 – zaph

+0

我認爲你的第二個努力是正確的,並且要在操場上進行驗證,但是我無法讓xcode6運行足夠長的時間來確認。 –

回答

4

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

  1. valueForKeyPath返回隱式解包的AnyObject(AnyObject!)的可選項。這意味着它可以是零或它可以有一個值。
  2. 試圖將其轉換爲一個String
  3. 如果無法將其轉換爲String,返回nil使得statusnil。如果這的確是一個非零String回報使返回的任何字符串
4

由於文件說status

因爲向下轉換可能失敗,類型轉換操作有兩種不同的形式。可選表單,如?所示,返回您試圖向下轉換的可選值。

摘錄自:Apple Inc.「The Swift Programming Language。」iBooks。 https://itun.es/au/jEUH0.l

這意味着,當你寫as? String,返回值會自動包裝在一個可選的你,所以由此產生的實際類型String?,這是你想要的行爲,所以你的第二個選擇是正確。

在你的第一個例子,你想投的valueForKeyPath返回的值,這是AnyObject!型(!手段隱含展開),以String?,這是明確包裹,而這個值不自動包裝在你的可選項中,因此,由於這些類型不相同,它們之間的投射可能不起作用。

TL; DR:你的第一個選項是實際上是不正確(儘管它不應該崩潰的編譯器,這是一個bug),和你的第二個選擇是正確的,你想要做什麼。