如何强制打开“存储”为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
。
答案 0 :(得分:0)
忽略答案并没有真正提供解决方案 - 问题看起来像编译器错误
我现在不删除它,所以读者知道我尝试了什么,以及我如何误解了真正的问题:
如何打开存储在
变量中的可选值Any
类型
另外请务必阅读评论。
在您的代码中,您使用的是可选绑定。强制解包使用后缀!
运算符:
println(optionalString!)
但是如果可选字符串包含nil值,则会引发运行时异常。因此,除非你100%确定它不是零,否则我建议使用可选的绑定:
if let unwrappedString = optionalString {
println(unwrappedString)
}
也就是说,如果你有一个存储在Any
变量中的可选字符串,使用可选的向下转换和可选绑定,你可以提取如下:
var anyString: Any? = "optional string" as String?
if let unwrappedString = anyString as? String {
println(unwrappedString)
}
如果您想使用强制向下广播,那就是:
println(anyString as String)
但在强制解包时,如果anyString
为零,则会导致运行时异常。
如果anyString
变量不是可选的,事情甚至更简单,因为没有可选的绑定,只是可选的向下转换,尽管相关代码看起来完全相同:
var anyString: Any = "optional string"
if let downcastedString = anyString as? String {
println(downcastedString)
}
答案 1 :(得分:0)
如果您有Any,那么您可以测试它是否是可选的,并且使用以下内容为零:
var anyValue: String? = "The string"
var theValue: Any = anyValue
let mi:MirrorType = reflect(theValue)
if mi.disposition == .Optional {
if mi.count == 0 { return NSNull() } // Optional.None
let (name,some) = mi[0]
theValue = some.value
}
现在,theValue将只是一个String而不是一个可选字符串。所以你可以把它投射并用作String。