【问题标题】:Swift Optional Generics Type required even though parameter is nil [duplicate]即使参数为零,也需要 Swift 可选泛型类型 [重复]
【发布时间】:2020-04-13 05:15:54
【问题描述】:

如何修复这个方法声明,让 Payload 在不需要时完全省略,现在它需要提供通用类型,即使它应该使用默认的 nil 值。最后我复制了这个方法,省略了 Payload 部分以消除这个错误,但寻找任何提示,以便我可以再次对我的代码进行重复数据删除。

提前致谢

func prepareRequest<Payload: Encodable>(for url: URL, method: String = "GET", payload: Payload? = nil) -> AnyPublisher<URLRequest, Never> {
// ...
}

【问题讨论】:

    标签: swift generics


    【解决方案1】:

    创建另一个重载是这样做的方法。 Swift 还没有variadic generics。在那之前,您需要为每个占位符的数量进行重载。零是这些数字之一!

    通常,这意味着您将使用第三个(可能是private)函数来实现通用功能。

    注意:无法使用这些默认参数,即使它们可以编译!

    private func common() { }
    
    func ƒ() { common() }
    ƒ()
    
    func ƒ<T>(_: T? = nil) { common() }
    ƒ( () )
    
    func ƒ<T0, T1>(_: (T0, T1)? = nil) { common() }
    ƒ(
      ( (), () )
    )
    

    【讨论】:

    • 感谢 Jessy 的解释。我将尝试提取公共代码,但这并不容易,因为这是合并发布者代码,并且在此发布者中添加(或不添加)有效负载
    【解决方案2】:

    Payload 必须是某种东西。在这种情况下,它是什么并不重要,但仍然必须知道它。该值为 nil 的事实并不意味着您不会在实现内部以某种方式使用该类型本身,因此 Swift 需要知道它是什么。

    最简单的方法是将它分配给已经可以编码的东西,比如字符串,添加以下重载:

    func prepareRequest(for url: URL, method: String = "GET") -> AnyPublisher<URLRequest, Never> {
        return prepareRequest(for: url, method: method, payload: Optional<String>.none)
    }
    

    您必须使用重载来执行此操作; Swift 中没有“默认类型参数”功能。但是任何时候你遇到默认参数的限制,你都可以把它当作一个重载来处理。毕竟,默认参数只是更易于键入的重载。

    如果您像我一样,不得不选择像 String 这样的随机类型很烦人。这里正确的类型是 Never,但 Never 不符合 Encodable。它应该(永远不应该符合一切),但我们可以手动修复它:

    extension Never: Encodable {
        public func encode(to encoder: Encoder) throws {
            fatalError()
        }
    }
    func prepareRequest(for url: URL, method: String = "GET") -> AnyPublisher<URLRequest, Never> {
        return prepareRequest(for: url, method: method, payload: Optional<Never>.none)
    }
    

    这样做并没有比使用 String 真正的明显优势,但它让我感觉更好。

    【讨论】:

    • 谢谢...我现在明白了。所以我会跟上这个重载并尝试从一个重载中删除公共部分
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多