提问人:Morniak 提问时间:6/13/2014 最后编辑:user3737791Morniak 更新时间:6/13/2014 访问量:8562
在 swift 中转换为可选值
Casting to an optional value in swift
问:
当我写这篇文章时:
// json is of type AnyObject
var status : String? = json.valueForKeyPath("status") as String?
Xcode 似乎在编译过程中被无限循环阻塞:
我的代码有问题吗?
我做了一些测试,当我写道:
var status : String? = json.valueForKeyPath("status") as? String
Xcode能够编译,但是当返回时会有什么行为。valueForKeyPath
nil
答:
5赞
drewag
6/13/2014
#1
您的第二个版本是正确的。应该将可选值分配给可以返回 nil 的语句。这是该行的流程:
- valueForKeyPath 返回 AnyObject () 的隐式解包可选。这意味着它可以是 nil,也可以有一个值。
AnyObject!
- 尝试将其转换为
String
- 如果无法将其转换为 ,则返回 。如果它确实是非 nil 返回,则返回任何字符串
String
nil
status
nil
String
status
6赞
Greg
6/13/2014
#2
正如文档所说:
由于下转换可能会失败,因此类型转换运算符有两种不同的形式。可选形式 as? 返回您尝试向下转换为的类型的可选值。
摘自:Apple Inc.“The Swift Programming Language”。 iBooks。https://itun.es/au/jEUH0.l
这意味着当你编写 时,返回值会自动包装在 a 可选值中,因此由此产生的实际类型是 ,这是您想要的行为,因此您的第二个选项是正确的。as? String
String?
在第一个示例中,您尝试将 返回的值转换为 ,该值的类型(表示隐式解包)为 ,该值是显式包装的,并且该值不会自动包装在可选值中,因此,由于这些类型不相同,因此在它们之间进行强制转换可能不起作用。valueForKeyPath
AnyObject!
!
String?
TL;DR:你的第一个选项实际上是不正确的(虽然它不应该使编译器崩溃,这是一个错误),而你的第二个选项是正确的,可以做你想做的事。
下一个:物镜C中的动态缓冲器(带ARC)
评论
json
AnyObject