Как преобразовать ограниченное принудительное значение в дополнительное необязательное значение?

Преобразование необязательного значения в принудительное значение работает довольно просто:

    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.)

Другие вопросы по тегам