在 swift 中转换为可选值

Casting to an optional value in swift

提问人:Morniak 提问时间:6/13/2014 最后编辑:user3737791Morniak 更新时间:6/13/2014 访问量:8562

问:

当我写这篇文章时:

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

Xcode 似乎在编译过程中被无限循环阻塞:Xcode

我的代码有问题吗?

我做了一些测试,当我写道:

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

Xcode能够编译,但是当返回时会有什么行为。valueForKeyPathnil

iOS Xcode Swift Xcode6

评论

0赞 zaph 6/13/2014
是什么类型?你为什么要指定?jsonAnyObject
0赞 zaph 6/13/2014
考虑到 Swift 是早期的 Beta 版,预计它会有错误。
0赞 Mike Pollard 6/13/2014
我认为您的第二次努力是正确的,并且将在操场上进行验证,但我无法让 xcode6 运行足够长的时间来确认。

答:

5赞 drewag 6/13/2014 #1

您的第二个版本是正确的。应该将可选值分配给可以返回 nil 的语句。这是该行的流程:

  1. valueForKeyPath 返回 AnyObject () 的隐式解包可选。这意味着它可以是 nil,也可以有一个值。AnyObject!
  2. 尝试将其转换为String
  3. 如果无法将其转换为 ,则返回 。如果它确实是非 nil 返回,则返回任何字符串StringnilstatusnilStringstatus
6赞 Greg 6/13/2014 #2

正如文档所说:

由于下转换可能会失败,因此类型转换运算符有两种不同的形式。可选形式 as? 返回您尝试向下转换为的类型的可选值。

摘自:Apple Inc.“The Swift Programming Language”。 iBooks。https://itun.es/au/jEUH0.l

这意味着当你编写 时,返回值会自动包装在 a 可选值中,因此由此产生的实际类型是 ,这是您想要的行为,因此您的第二个选项是正确的。as? StringString?

在第一个示例中,您尝试将 返回的值转换为 ,该值的类型(表示隐式解包)为 ,该值是式包装的,并且该值不会自动包装在可选值中,因此,由于这些类型不相同,因此在它们之间进行强制转换可能不起作用。valueForKeyPathAnyObject!!String?

TL;DR:你的第一个选项实际上是不正确的(虽然它不应该使编译器崩溃,这是一个错误),而你的第二个选项是正确的,可以做你想做的事。