快速转换为可选值

Mor*_*iak 3 xcode ios swift xcode6

当我写这个:

// json is of type AnyObject
var status : String? = json.valueForKeyPath("status") as String?
Run Code Online (Sandbox Code Playgroud)

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

我的代码有问题吗?

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

var status : String? = json.valueForKeyPath("status") as? String
Run Code Online (Sandbox Code Playgroud)

Xcode 能够编译,但是什么时候valueForKeyPath返回nil.

dre*_*wag 5

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

  1. valueForKeyPath 返回一个隐式解包的 AnyObject ( AnyObject!) 选项。这意味着它可以是 nil 或者它可以有一个值。
  2. 尝试将其转换为 String
  3. 如果无法将其转换为 a String,则返回nilMaking status nil。如果它确实是一个非零String返回,status则返回任何字符串


Gre*_*reg 5

正如文档所说:

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

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

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

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

TL;DR:您的第一个选项实际上是不正确的(尽管它不应该使编译器崩溃,这是一个错误),而您的第二个选项是正确的并且可以执行您想要的操作。