如何强制解包存储为Any的可选字符串

时间:2014-11-18 12:52:29

标签: reflection swift

如何强制打开“存储”为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

2 个答案:

答案 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。