【问题标题】:Is it possible for a Generic to be optional and nil?Generic 是否有可能是可选的并且为零?
【发布时间】:2020-01-07 18:05:38
【问题描述】:

我试图从控制台上的 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)

但是对于错误情况,我不能只传递通用的 nil。

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

我收到此错误

无法推断通用参数“T”

这很容易理解,所以我的问题是有什么办法可以通过使用 Generic 来使用相同的方法?在这种情况下,Generic 可以是可选的和 nil 吗?或者我唯一的选择是为错误和成功案例制作两种不同的方法。

【问题讨论】:

  • 在这种情况下你真的需要 Generic 吗?改用Any? 怎么样?

标签: swift generics


【解决方案1】:

即使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?)

一切都应该正常。这样你就可以给你的编译器一个关于类型的提示,这就是它所需要的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-23
    • 2020-01-19
    • 2021-12-20
    • 2010-09-05
    • 2012-10-03
    • 2018-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多