2014-09-03 55 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