No, inout should *not* be covariant, since foo can assign any subtype of P to its parameter, not just F:
protocol P {} struct F: P {} struct G: P {} func foo(_ p: inout P) { p = G() } var f = F() foo(&f) // assigns a value of type G to a variable of type F >From Jonathan > On Dec 10, 2017, at 12:51 AM, Adrian Zubarev via swift-evolution > <swift-evolution@swift.org> wrote: > > Hello Matthew, I have more more question about the generalized supertype > constraints. Does the generalization also covers inout? I found a really > annoying case with inout. > > protocol P {} > > func foo(_ p: inout P) { > print(p) > } > > struct F : P {} > > var f = F() > > foo(&f) // won't compile until we explicitly write `var f: P = F()` > Shouldn’t we allow inout to have subtypes as well, like inout F : inout P? > > This is actually one of the pain points with the generic version of the print > function. We cannot pass an arbitrary TextOutputStream to it without > sacrificing the type. I doubt the generic print function is justified, > because TextOuputStream does not have associated types nor a Self constraint. > Furthermore it forces you to create a custom type-erased wrapper that can > hold an arbitrary TextOutputSteram. > > If this is part of a totally different topic, I’ll move it in it’s own thread. > > > > Am 2. Dezember 2017 um 19:03:24, Matthew Johnson via swift-evolution > (swift-evolution@swift.org) schrieb: > >> This thread received very light, but positive feedback. I would really like >> to see this feature added and am willing to draft and official proposal but >> am not able to implement it. If anyone is interested in collaborating just >> let me know. >> >> >>> On Nov 24, 2017, at 5:03 PM, Matthew Johnson via swift-evolution >>> <swift-evolution@swift.org> wrote: >>> >>> One of the most frequent frustrations I encounter when writing generic code >>> in Swift is the requirement that supertype constraints be concrete. When I >>> mentioned this on Twitter >>> (https://twitter.com/anandabits/status/929958479598534656) Doug Gregor >>> mentioned that this feature is smaller and mostly straightforward to design >>> and implement (https://twitter.com/dgregor79/status/929975472779288576). >>> >>> I currently have a PR open to add the high-level description of this >>> feature found below to the generics manifesto >>> (https://github.com/apple/swift/pull/13012): >>> >>> Currently, supertype constraints may only be specified using a concrete >>> class or protocol type. This prevents us from abstracting over the >>> supertype. >>> >>> ```swift >>> protocol P { >>> associatedtype Base >>> associatedtype Derived: Base >>> } >>> ``` >>> >>> In the above example `Base` may be any type. `Derived` may be the same as >>> `Base` or may be _any_ subtype of `Base`. All subtype relationships >>> supported by Swift should be supported in this context including, but not >>> limited to, classes and subclasses, existentials and conforming concrete >>> types or refining existentials, `T?` and `T`, `((Base) -> Void)` and >>> `((Derived) -> Void)`, etc. >>> >>> Generalized supertype constraints would be accepted in all syntactic >>> locations where generic constraints are accepted. >>> >>> I would like to see generalized supertype constraints make it into Swift 5 >>> if possible. I am not an implementer so I will not be able to bring a >>> proposal forward alone but am interested in collaborating with anyone >>> interested in working on implementation. >>> >>> I am also interested in hearing general feedback on this feature from the >>> community at large. Have you also found this limitation frustrating? In >>> what contexts? Does anyone have reservations about introducing this >>> capability? If so, what are they? >>> >>> Matthew >>> >>> _______________________________________________ >>> swift-evolution mailing list >>> swift-evolution@swift.org >>> https://lists.swift.org/mailman/listinfo/swift-evolution >> >> _______________________________________________ >> swift-evolution mailing list >> swift-evolution@swift.org >> https://lists.swift.org/mailman/listinfo/swift-evolution > > _______________________________________________ > swift-evolution mailing list > swift-evolution@swift.org > https://lists.swift.org/mailman/listinfo/swift-evolution
_______________________________________________ swift-evolution mailing list swift-evolution@swift.org https://lists.swift.org/mailman/listinfo/swift-evolution