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
无法展开,因为它不是可选的,而向下转换到可选的则不起作用,因为它表示它是更可选的类型。该死。向苹果提交了一份支持请求,要求他们澄清任何人现在可以做什么。谢谢你一路上的帮助,不客气。抱歉,没有回答真正的问题。。。我很想知道解决方案,所以如果你有任何消息,请在这里报道