У меня есть два разных сценария, в которых мне нужно проверить «необязательность» необязательного типа. Мне не удалось понять, как явно проверить, является ли переменная .None
или .Some
, кроме как с громоздким оператором switch. Как я могу проверить Someness
с помощью оператора if
?
Сценарий 1
Я пишу средство форматирования адресов, и мои входные данные представляют собой ряд строк? типы. В этом примере будет работать простой тест на (str != nil)
. Однако, поскольку моя другая потребность связана с «двойным необязательным», а нулевой тест не может различить .Some(.None)
и .None
, решение этой проблемы решит и эту проблему.
Вот версия, которая работает с switch
let address1:String? = "123 Main St"
let address2:String? = nil
let apt:String? = "101"
let components = [address1, address2, apt].filter( { (c) -> Bool in
switch c {
case .Some: return true
case .None: return false
}
}).map { return $0! } //Had to map because casting directly to [String] crashes
print(", ".join(components)) //"123 Main St, 101"
Я бы хотел увидеть что-то вроде if
:
let nice = ["123 Main St", nil, "303"].filter { (c) -> Bool in
return (c == .Some)
}
print(", ".join(nice))
Сценарий 2
Вот где нулевой тест не сработает. Если что-то является строкой ?? это может быть любое из .None
, .Some(.None)
или .Some(.Some(String))
. В моем случае переменная несет идентификатор записи из вызова API, который может отсутствовать полностью (.None
), значение (.Some(.Some("ABDEFG")
) или явно NULL
(.Some(.None)
).
let teamNoneNone: String?? = .None
let teamSomeNone: String?? = .Some(.None)
let teamSomeSome: String?? = "My favorite local sportsball team"
if teamNoneNone == nil {
print("teamNoneNone is nil but is it .None? We don't know!") //prints
} else {
print("teamNoneNone is not nil")
}
if teamSomeNone == nil {
print("teamSomeNone is nil")
} else {
print("teamSomeNone is not nil but is it .Some(.None)? We don't know!") //prints
}
if teamSomeSome == nil {
print("teamSomeSome is nil but is it .None? We don't know!")
} else {
print("teamSomeSome is not nil but is it .Some(.None) or .Some(.Some())? We don't know!") //prints
}
В другом сообщении SO я нашел подобное обходное решение, но не очень понятно, что происходит со случайным читателем:
if let team: String? = teamSomeNone {
print("teamSomeNone is Some(.None)") //prints
} else {
print("teamSomeNone is .Some(.Some())")
}
if (aMaybeObj)
) - person Carcigenicate   schedule 17.04.2015