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 真正的明显优势,但它让我感觉更好。