Неявно развернутая дополнительная жалоба Enum - PullRequest
0 голосов
/ 07 февраля 2019

В настоящий момент я получаю следующие ошибки при попытке запустить следующий код: enum case good not found in type Situation? и enum case bad not found in type Situation?

enum Situation: Error {
        case good
        case bad
}

class SituationHandler {
    var situation: Situation!
    static let shared = SituationHandler()
}

class Scenario {

    func handleScenario() {

        let situation = SituationHandler.shared.situation
        switch situation {
        case .good:
            print("All good")
        case .bad:
            print("All bad")
        }

    }
}

Если я использую ситуацию в situationHandler как неявно развернутуюНеобязательно, я не должен получать эту жалобу?Что я делаю не так?

Спасибо за помощь всем, кто ответит на этот вопрос.

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Думайте о неявно развернутых опциональных параметрах как о дополнительных, которые могут быть преобразованы в неопциональные с помощью системы типов.По сути, они все еще являются опциями.Ваш фрагмент кода не дает системе типов каких-либо указаний на то, что вы действительно хотите не необязательное значение.Вы можете явно развернуть или использовать вывод типа, чтобы получить развернутое значение.Обратите внимание, что в любом случае небезопасная развертка (и если у вас есть значение nil, оно все равно будет аварийно завершено).

struct SomeObject {

    let iuo: Int! = 3

}

let value1 = SomeObject().iuo
print(type(of: value1)) // Optional<Int>

let value2: Int = SomeObject().iuo
print(type(of: value2)) // Int

let value3 = SomeObject().iuo!
print(type(of: value3)) // Int
0 голосов
/ 07 февраля 2019

Неявно развернутые дополнительные параметры по-прежнему являются дополнительными.Если они могут использоваться как обычные дополнительные функции, они будут.

Вы можете принудительно развернуть развертывание, просто объявив необязательный тип:

let situation: Situation = SituationHandler().shared.situation

или добавив ! явно:

let situation = SituationHandler().shared.situation!

Обратите внимание, что:

SituationHandler().shared.situation

не имеет никакого смысла.shared всегда новый экземпляр.Чтобы иметь синглтон, вам необходимо:

class SituationHandler {
   var situation: Situation!
   static let shared = SituationHandler()
}

, а затем:

SituationHandler.shared.situation

Также я бы посоветовал использовать значение по умолчанию вместо IUO:

class SituationHandler {
    var situation: Situation = .bad
    static let shared = SituationHandler()
}
...