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

标签 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

最佳答案

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

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

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/

相关文章:

通过泛型实现的 C# 参数化属性类?

Java:如何调用名称存储在字符串变量中的函数

swift - 如何为标签添加约束?

ios - 将 UIImage 转换为 (NS)Data 会产生 nil?

swift - 无法将类型 'UIAlertAction' 的值转换为预期的参数类型 'UIViewController'?

swift - 将 if 子句转换为可选值

java - 使用反射调用方法时的通用返回类型

c# - 获取作为参数发送的变量的名称

java - 读取打包在 Zipfile 中的 Jar 中找到的类

ios - CABasicAnimation 始终不工作