2014-11-23 166 views
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?> 

但这给出了错误:

'String' is not identical to 'String?'

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

VAR myOtherArray: Array = myArray

我以为我对此有一个公正的把握,但现在我不确定。如何将包含的强制值转换为包含的可选值(使用娱乐循环的最简单方法)?

娱乐活动for循环(不理想):

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

    var myOtherArray: Array<String?> = [] 

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

回答

1

你必须通过每个元素转换为一个可选的以创建新的阵列。 但不是一个for循环,您可以使用map()

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

而你在我目前的Xcode周围的其他方法

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

中止转换与

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

方法6.1。使用map()这里的工作原理:

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

(当然,这会在运行时中止如果有数组元素是nil

相关问题