我如何强制解包“存储”为 Any
的可选值?
let optionalString: String? = "optional string"
let anyString: Any = optionalString
if let unwrappedString = anyString as? String {
println(unwrappedString)
// does not recognize the anyString as an optinal String
}
我如何编写 if 语句来强制解包存储在 anyString
中的值并打印 optionalString
值?我必须只访问 anyString
属性。
此用例是从 MirrorType
中获取值,它将属性值存储为 Any
。
最佳答案
忽略答案,因为它并没有真正提供解决方案 - 这个问题看起来像是一个编译器错误
我现在不会删除它,以便读者知道我尝试了什么,以及我如何误解了真正的问题:
How to unwrap an optional value stored in a variable of
Any
type
另外一定要阅读评论。
在您的代码中,您使用的是可选绑定(bind)。强制展开改为使用后缀 !
运算符:
println(optionalString!)
但如果可选字符串包含 nil 值,则会引发运行时异常。因此,除非您 100% 确定它不是 nil,否则我建议使用可选绑定(bind):
if let unwrappedString = optionalString {
println(unwrappedString)
}
就是说,如果您有一个可选的字符串存储在 Any
变量中,使用可选的向下转换和可选的绑定(bind),您可以按如下方式提取:
var anyString: Any? = "optional string" as String?
if let unwrappedString = anyString as? String {
println(unwrappedString)
}
如果你想使用强制向下转换,那很简单:
println(anyString as String)
但与强制解包一样,如果 anyString
为 nil,这将导致运行时异常。
如果 anyString
变量不是可选的,事情就更简单了,因为没有可选的绑定(bind),只有可选的向下转型,尽管相关代码看起来完全一样:
var anyString: Any = "optional string"
if let downcastedString = anyString as? String {
println(downcastedString)
}
关于reflection - 如何强制解包存储为 Any 的可选字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26994834/