Возможно ли для Generi c быть необязательным и нулевым? - PullRequest
0 голосов
/ 07 января 2020

Я пытался напечатать мой вывод API на консоли для целей отладки. У меня есть этот метод, который я планировал вызывать в обоих случаях, для ошибки и успеха.

private static func printDetail<T>(route: APIRouter, resultSuccess: T? = nil, resultError: Any? = nil) where T: Codable {
    let isSuccess = resultSuccess != nil

    isSuccess ? print("✅✅✅✅✅✅") : print("❌❌❌❌❌❌❌❌")

    // FOR Debuging Purposes
    print("----------------")
    print("REQUEST")
    print("----------------")

    print("PATH : --> " + route.fullPath)

    print("parameters : --> ")
    print((route.parameters ?? "none"))

    print("methods : --> ")
    print((route.method.rawValue))

    print("Headears : --> ")
    print((route.allHeaders))

    print("----------------")
    print("Response")
    print("----------------")

    if isSuccess {
        let json = try! getJson(model: resultSuccess!)
        print(json)
    } else {
        print(resultError!)
    }

    print("----------------")

    isSuccess ? print("✅✅✅✅✅✅") : print("❌❌❌❌❌❌❌❌")
}

Так что я назвал это для случая успеха, и он работал как я ожидал.

// For Simplicity assume value is any Generic
// let value: (T)


self.printDetail(route: route, resultSuccess: value)

Но в случае ошибки я не могу просто передать универсальный c ноль.

self.printDetail(route: route, resultError: jsonResult)

Я получаю эту ошибку

Generi c параметр 'T' не может быть выведено

Что довольно понятно, поэтому мой вопрос, есть ли что-нибудь, что можно сделать, чтобы использовать тот же метод, используя Generi c? Может Generi c быть необязательным и нулевым в этом сценарии? или единственный вариант, который у меня есть, - создать два разных метода для случаев ошибки и успеха.

1 Ответ

1 голос
/ 07 января 2020

Даже nil можно привести в необязательный тип, который должен быть достаточным для вас. Если я правильно понимаю ваш вопрос, вы хотите, чтобы он был таким:

func printDetail<SuccessType, ErrorType>(route: APIRouter, resultSuccess: SuccessType? = nil, resultError: ErrorType? = nil) where SuccessType: Codable {

Теперь, если вы попытаетесь позвонить по следующему номеру, вы получите сообщение об ошибке:

printDetail(route: route, resultSuccess: nil, resultError: nil) // Generic parameter 'ErrorType' could not be inferred

Но если вы просто бросьте свои nil объекты:

printDetail(route: route, resultSuccess: nil as String?, resultError: nil as String?)

Все должно работать нормально. Таким образом вы дадите компилятору подсказку о типах, и это все, что ему нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...