将可选值转换为强制值非常简单:
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/