Как получить доступ к результатам переключения обращения?

#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 в самих блоках обращения.