2014-06-13 38 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),和你的第二个选择是正确的,你想要做什么。