Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
即使参数为nil,也需要Swift可选泛型类型_Swift_Generics - Fatal编程技术网

即使参数为nil,也需要Swift可选泛型类型

即使参数为nil,也需要Swift可选泛型类型,swift,generics,Swift,Generics,如何修复此方法声明以在不需要时完全忽略有效负载,现在需要提供泛型类型,即使它应该使用默认值nil值。最后,我复制了这个方法,省略了有效负载部分,以消除这个错误,但寻找任何提示,以便再次重复删除代码 提前谢谢 func prepareRequest<Payload: Encodable>(for url: URL, method: String = "GET", payload: Payload? = nil) -> AnyPublisher<URLRequest, Nev

如何修复此方法声明以在不需要时完全忽略有效负载,现在需要提供泛型类型,即使它应该使用默认值
nil
值。最后,我复制了这个方法,省略了有效负载部分,以消除这个错误,但寻找任何提示,以便再次重复删除代码

提前谢谢

func prepareRequest<Payload: Encodable>(for url: URL, method: String = "GET", payload: Payload? = nil) -> AnyPublisher<URLRequest, Never> {
// ...
}
func prepareRequest(对于url:url,方法:String=“GET”,负载:负载?=nil)->AnyPublisher{
// ...
}

创建另一个重载是一种方法。斯威夫特还没有。在此之前,每个占位符都需要一个重载。零就是其中之一

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

注意:即使编译了这些默认参数,也不可能使用它们

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

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

最简单的方法是将其分配给已可编码的内容,如字符串,并添加以下重载:

func prepareRequest(for url: URL, method: String = "GET") -> AnyPublisher<URLRequest, Never> {
    return prepareRequest(for: url, method: method, payload: Optional<String>.none)
}
func prepareRequest(对于url:url,方法:String=“GET”)->AnyPublisher{
return prepareRequest(for:url,method:method,payload:Optional.none)
}
你必须用重载来实现这一点;Swift中没有“默认类型参数”功能。但任何时候遇到默认参数的限制时,都可以将其作为重载处理。毕竟,默认参数更容易输入重载

如果你像我一样,必须选择像字符串这样的随机类型是很烦人的。此处的正确类型为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)
}
扩展从不:可编码{
公共函数编码(到编码器:编码器)抛出{
法塔莱罗()
}
}
func prepareRequest(对于url:url,方法:String=“GET”)->AnyPublisher{
return prepareRequest(for:url,method:method,payload:Optional.none)
}

这样做并没有比使用字符串更明显的好处,但它让我感觉更好。

谢谢Jessy的解释。我将尝试提取常见代码,但这并不容易,因为这是组合发布者代码,并且在发布者库中添加(或不添加)有效负载。。。我现在明白了。因此,我将继续使用这个重载,并尝试从一个重载中删除公共部分