#swift
#swift
Вопрос:
Как получить доступ к результату оператора switch в примере кода Apple swift book?
Я думаю, я мог бы создать функцию, которая просто возвращает значение оператора case, но я пытаюсь понять этот код.
enum ServerResponse {
case Result(String, String)
case Error(String)
}
let success = ServerResponse.Result("6:00 am", "8:09 pm")
let failure = ServerResponse.Error("Out of cheese.")
switch success {
case let .Result(sunrise, sunset):
let serverResponse = "Sunrise is at (sunrise) and sunset is at (sunset)."
case let .Error(error):
let serverResponse = "Failure... (error)"
}
Ответ №1:
Пример настолько надуманный, что он совсем не полезен. Рассмотрим это
enum ServerResponse {
case Result(String, String)
case Error(String)
}
for i in 1...100 {
let mySuccess: ServerResponse = {
let zeroOrOne = rand() % 2
if zeroOrOne == 0 {
return ServerResponse.Result("7:00 am", "8.09 pm")
} else {
return ServerResponse.Error("Out of cheese.")
}
}()
var serverResponse: String
switch mySuccess {
case let .Result(sunrise, sunset):
serverResponse = "Sunrise is at (sunrise) and sunset as (sunset)"
case let .Error(error):
serverResponse = "Failure... (error)"
}
println(serverResponse)
}
Суть в том, что переменная ‘success’ в примере действительно должна быть присвоением в результате вызова некоторой функции / подсистемы. Я завернул его в цикл для ясности println ()
Комментарии:
1. Круто, но зачем использовать встроенный стиль закрытия для назначения
mySuccess
, а неserverResponse
?
Ответ №2:
Вы хотели бы объявить свою serverResponse
переменную вне блока кода переключателя:
var serverResponse: String
switch success {
case let .Result(sunrise, sunset):
serverResponse = "Sunrise is at (sunrise) and sunset is at (sunset)."
case let .Error(error):
serverResponse = "Failure... (error)."
}
Ответ №3:
Я думаю, что это всего лишь неполный пример.
Обычно вы делаете что-то в блоках обращения, что оказывает видимый эффект снаружи (а не просто присваиваете его локальной переменной, к которой нельзя получить доступ за пределами блока переключения).
Обратите внимание, что вы, конечно, можете получить доступ sunrise
к , sunset
, error
и serverResponse
в самих блоках обращения.