Во-первых, я пытаюсь отображения [String?]
, чтобы получить [String]
:Почему Swift nil-coalescing возвращает необязательный?
$ xcrun swift
Welcome to Apple Swift version 2.2 (swiftlang-703.0.18.8 clang-703.0.30). Type :help for assistance.
1> import Foundation
2> let j: [String?] = ["a", nil]
j: [String?] = 2 values {
[0] = "a"
[1] = nil
}
3> j.map {$0 ?? ""}
$R0: [String] = 2 values {
[0] = "a"
[1] = ""
}
Это имеет смысл для меня. Я ноль-coalesce String?
, и я получаю String
. Но с [AnyObject?]
, что-то странное происходит:
4> let k: [AnyObject?] = ["a", nil]
k: [AnyObject?] = 2 values {
[0] = "a"
[1] = nil
}
5> k.map {$0 ?? ""}
$R1: [AnyObject?] = 2 values {
[0] = "a"
[1] = (instance_type = 0x00007fff7bc2c140 @"")
}
Я Nil-сливающихся УСТРОЙСТВА, но на этот раз я выберусь необязательная. Зачем?
Swift Programming Language говорит a ?? b
является сокращением для a != nil ? a! : b
, но когда я пытаюсь что я получаю из массива, не являющихся дополнительными опциями:
6> k.map {$0 != nil ? $0! : ""}
$R2: [AnyObject] = 2 values {
[0] = "a"
[1] = ""
}
ли я непонимание, как ??
должен работать? Что здесь происходит?
Интересный вопрос, по той же причине это, похоже, работает 'let res: [AnyObject] = k.map {$ 0 ?? ""} ' –
Похож на странную проблему вывода типа с' AnyObject' и литералами - это также работает: 'let k1 = k.map {$ 0 ?? String()} ' – Hamish