xcode - 如何将包含的强制值转换为包含的可选值?

标签 xcode swift type-conversion option-type optional-values

将可选值转换为强制值非常简单:

    var aString: String? = "Hello"

    var anotherString: String = aString!

相反的方向更简单,因为没有展开:

    var myString: String = "Hello"

    var myOtherString: String? = myString

将包含可选值的强制值数组转换为包含强制值的强制值数组要复杂一些:

    var anArray: Array<String?> = ["Hello"]

    var anotherArray: Array<String> = anArray as Array<String>

这里有点不同的是,您不需要 ! 来解包该值。您只是告诉它期望什么类型。

这就是我陷入困境的地方。对我来说,做相反的事情应该是这样的:

    var myArray: Array<String> = ["Hello"]

    var myOtherArray: Array<String?> = myArray as Array<String?>

但这给出了错误:

'String' is not identical to 'String?'

简单地说,它给出了相同的错误:

var myOtherArray: 数组 = myArray

我以为我对此有一定的了解,但现在我不确定。如何将包含的强制值转换为包含的可选值(不使用休闲 for 循环)?

休闲 for 循环(不理想):

    var myArray: Array<String> = ["Hello"]

    var myOtherArray: Array<String?> = []

    for loopString: String in myArray {
        myOtherArray.append(loopString)
    }

最佳答案

您必须通过将每个元素转换为可选元素来创建一个新数组。 但您可以使用 map() 来代替 for 循环:

var myArray = ["Hello"]
var myOtherArray = map(anotherArray) { Optional($0) }
println(myOtherArray) // [Optional("Hello")]

以及相反的转换方法

var anArray: Array<String?> = ["Hello"]
var anotherArray: Array<String> = anArray as Array<String>

中止

fatal error: can't unsafeBitCast between types of different sizes

in my current Xcode 6.1. Using map() here works:

var anArray: Array<String?> = ["Hello"]
var anotherArray = map(anArray) { $0! }
println(anotherArray) // [Hello]

(当然,如果任何数组元素为 nil,这将在运行时中止。)

关于xcode - 如何将包含的强制值转换为包含的可选值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27088546/

相关文章:

ios - NSTimer 每 30 秒运行一次,但总是在 xx :00sec or xx:30sec of a minute 上触发

Swift 3 Alamofire 请求进度

linux - 修复 AttributeError : 'file' object has no attribute 'buffer' (Python3)

ios - Swift:App Delegate 应该如何获取对 View Controller 的引用?

objective-c - 在 Xcode 调试器中检查数组的内容

ios - XCode 框架/库开发工作流程

javascript - 如何使用 JavaScriptCore 将错误记录到 XCode?

ios - 让UIButton点击显示UIWebview

r - 导入不带千位分隔符的 csv 并将因子转换为数字,而不会丢失小数点分隔符

JAVASCRIPT 数据类型问题