The following code produces the "Typealias overriding associated type" warning for the typealias
extension RawRequestEncodable
.
import Foundation
protocol RequestRouter { }
struct Router: RequestRouter { }
protocol Requestable {
associatedtype Parameters: Encodable
associatedtype Response: Decodable
func route() -> RequestRouter
func parameters() -> Parameters
}
extension Requestable where Self: Encodable {
func parameters() -> Self { return self }
}
protocol RawRequestEncodable: Requestable {
associatedtype RawRequest: Requestable
func asRawRequest() -> RawRequest
}
extension RawRequestEncodable {
typealias Response = Self.RawRequest.Response
func route() -> RequestRouter {
return asRawRequest().route()
}
func parameters() -> Self.RawRequest.Parameters {
return asRawRequest().parameters()
}
}
struct BaseRequest: Encodable { }
extension BaseRequest: Requestable {
typealias Response = String
func route() -> RequestRouter {
return Router()
}
}
struct Request { }
extension Request: RawRequestEncodable {
func asRawRequest() -> BaseRequest {
return BaseRequest()
}
}
Applying the fixit produces this code:
protocol RequestRouter { }
struct Router: RequestRouter { }
protocol Requestable {
associatedtype Parameters: Encodable
associatedtype Response: Decodable
func route() -> RequestRouter
func parameters() -> Parameters
}
extension Requestable where Self: Encodable {
func parameters() -> Self { return self }
}
protocol RawRequestEncodable: Requestable where Response == Self.RawRequest.Response {
associatedtype RawRequest: Requestable
func asRawRequest() -> RawRequest
}
extension RawRequestEncodable {
func route() -> RequestRouter {
return asRawRequest().route()
}
func parameters() -> Self.RawRequest.Parameters {
return asRawRequest().parameters()
}
}
struct BaseRequest: Encodable { }
extension BaseRequest: Requestable {
typealias Response = String
func route() -> RequestRouter {
return Router()
}
}
struct Request { }
extension Request: RawRequestEncodable {
func asRawRequest() -> BaseRequest {
return BaseRequest()
}
}
This code has an error, as now Request
doesn't conform to RawRequestEncodable
.
Now, using the suggested pattern from here where I redeclare the associatedtype Response
in RawRequestEncodable
fixes the issue and gets rid of the warning, but it seems like this fixit is buggy at least. Or is there a better way to write what I want here, where types conforming to RawRequestEncodable
only have to implement asRawRequest()
?
Also, editing this code causes compiler crashes. Xcode 10.1.