2014-09-03 117 views
3

在錯誤的洪水,我從更新到測試版7得了我得到這個特別的一個,這讓我的頭劃傷......的Xcode 6β7的NSDictionary的斯威夫特

 let views:NSDictionary = 
     [ 
      "leftView": _leftVC.view, 
      "rightView": _rightVC.view, 
      "outerView": _scrollView.superview 
     ]; 

錯誤: 無法轉換表達」 t type'Dictionary'鍵入'StringLiteralConvertible' 需要'views'的方法需要一個NSDictionary,所以我不能只使用一個Swift Dictionary。

我將如何調整上述代碼以滿足Xcode6 Beta7?

+1

你嘗試設置'views'第一次,然後當你調用該方法,鑄造'視圖'NSDictionary?我相信這就是Apple在其一些解決方法中所說的話。 – Rikkles 2014-09-03 17:10:26

回答

7

的問題是,UIScrollView.superview是可選的,所以你必須把展開的值在字典

let views:NSDictionary = 
[ 
    "leftView": _leftVC.view, 
    "rightView": _rightVC.view, 
    "outerView": _scrollView.superview! 
]; 

使用更安全的邏輯,而不是隱式展開的(即檢查superview不爲零),除非你100%確定它包含一個非零值。

即使views變量的類型爲NSDictionary,您用來初始化它的字典文本的計算結果爲一個快速字典 - 然後它被靜靜地橋接到NSDictionary

編譯器抱怨的原因是_scrollView.superview是可選的,它可能是零,這是不允許的。

正如@JackLawrance所指出的,即使用文字初始化,字典也可以具有非均勻的值類型。

旁註:我們何時會得到更有意義的錯誤消息? :)

+0

感謝您澄清問題所在! – BadmintonCat 2014-09-03 17:30:15

+1

用於構造「NSDictionary」的字典字面值不需要統一類型。另外,在任何情況下,只要類型具有共同的超類型,字典文字不需要統一類型。例如,這個文字的類型是'[String:UIView?]'。這裏實際發生的事情是Swift試圖防止你意外地將'nil'放入'NSDictionary'中,這是Objective-C中的一個常見錯誤,由於NSDictionary不能包含'nil',導致運行時崩潰。錯誤信息雖然很糟糕。 – 2014-09-05 01:41:16

+0

謝謝@JackLawrence,謝謝你指出。 – Antonio 2014-09-05 06:26:29