2014-11-23 164 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

相關問題