Reflection 如何强制展开存储为任意值的可选字符串

Reflection 如何强制展开存储为任意值的可选字符串,reflection,swift,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 } 如何编写

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

忽略答案,因为它并没有真正提供解决方案-这个问题看起来像编译器错误

我现在不会删除它,这样读者就知道我尝试了什么,以及我是如何误解了真正的问题的:

如何展开存储在
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
为nil,则会导致运行时异常


如果
anyString
变量不是可选的,事情就更简单了,因为没有可选的绑定,只有可选的向下转换,尽管相关代码看起来完全相同:

var anyString: Any = "optional string"

if let downcastedString = anyString as? String {
    println(downcastedString)
}

如果您有一个Any,那么您可以使用以下内容测试它是否是可选的,它是否为nil:

    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
    }

现在,该值将只是一个字符串,而不是可选字符串。因此,您可以将其转换为字符串。

因此无法检查其内容?我不允许将其更改为Any?,因为它是我实际使用的反射API。您在上次编辑时没有创建可选字符串,请尝试以我在代码示例中的方式声明Any,您将看到if-let检查无法识别它。我找不到解决方案-很容易将故障标记为bug。。。但这听起来确实是这样
anyString
无法展开,因为它不是可选的,而向下转换到可选的则不起作用,因为它表示它是更可选的类型。该死。向苹果提交了一份支持请求,要求他们澄清任何人现在可以做什么。谢谢你一路上的帮助,不客气。抱歉,没有回答真正的问题。。。我很想知道解决方案,所以如果你有任何消息,请在这里报道