0

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

    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?>

但这给出了错误:

“字符串”与“字符串”不同?

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

var myOtherArray: 数组 = myArray

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

休闲for循环(不理想):

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

    var myOtherArray: Array<String?> = []

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

1 回答 1

1

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

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>

中止

致命错误:不能在不同大小的类型之间使用 unsafeBitCast

在我当前的 Xcode 6.1 中。在这里使用map()有效:

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

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

于 2014-11-23T12:02:44.723 回答