Как преобразовать ограниченное принудительное значение в дополнительное необязательное значение?
Преобразование необязательного значения в принудительное значение работает довольно просто:
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: Array = myArray
Я думал, что у меня есть достаточно понимания, но теперь я не уверен. Как преобразовать ограниченное принудительное значение в дополнительное необязательное значение (если не использовать рекреационный цикл for)?
Рекреационный цикл (не идеальный):
var myArray: Array<String> = ["Hello"]
var myOtherArray: Array<String?> = []
for loopString: String in myArray {
myOtherArray.append(loopString)
}
1 ответ
Вы должны создать новый массив, преобразовав каждый элемент в необязательный. Но вместо цикла вы можете использовать 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
.)