<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body dir="auto">No, inout should *not* be covariant, since foo can assign any subtype of P to its parameter, not just F:<div><br></div><div>protocol P {}</div><div>struct F: P {}</div><div>struct G: P {}</div><div><br></div><div>func foo(_ p: inout P) {</div><div> p = G()</div><div>}</div><div><br></div><div>var f = F()</div><div>foo(&f) // assigns a value of type G to a variable of type F</div><div><br></div><div><div><div>From Jonathan</div></div><div><br>On Dec 10, 2017, at 12:51 AM, Adrian Zubarev via swift-evolution <<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>> wrote:<br><br></div><blockquote type="cite"><div><style>
body {
        font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
        padding:1em;
        margin:auto;
        background:#fefefe;
}
h1, h2, h3, h4, h5, h6 {
        font-weight: bold;
}
h1 {
        color: #000000;
        font-size: 28pt;
}
h2 {
        border-bottom: 1px solid #CCCCCC;
        color: #000000;
        font-size: 24px;
}
h3 {
        font-size: 18px;
}
h4 {
        font-size: 16px;
}
h5 {
        font-size: 14px;
}
h6 {
        color: #777777;
        background-color: inherit;
        font-size: 14px;
}
hr {
        height: 0.2em;
        border: 0;
        color: #CCCCCC;
        background-color: #CCCCCC;
display: inherit;
}
p, blockquote, ul, ol, dl, li, table, pre {
        margin: 15px 0;
}
a, a:visited {
        color: #4183C4;
        background-color: inherit;
        text-decoration: none;
}
#message {
        border-radius: 6px;
        border: 1px solid #ccc;
        display:block;
        width:100%;
        height:60px;
        margin:6px 0px;
}
button, #ws {
        font-size: 12 pt;
        padding: 4px 6px;
        border-radius: 5px;
        border: 1px solid #bbb;
        background-color: #eee;
}
code, pre, #ws, #message {
        font-family: Monaco;
        font-size: 10pt;
        border-radius: 3px;
        background-color: #F8F8F8;
        color: inherit;
}
code {
        border: 1px solid #EAEAEA;
        margin: 0 2px;
        padding: 0 5px;
}
pre {
        border: 1px solid #CCCCCC;
        overflow: auto;
        padding: 4px 8px;
}
pre > code {
        border: 0;
        margin: 0;
        padding: 0;
}
#ws { background-color: #f8f8f8; }
.bloop_markdown table {
border-collapse: collapse;
font-family: Helvetica, arial, freesans, clean, sans-serif;
color: rgb(51, 51, 51);
font-size: 15px; line-height: 25px;
padding: 0; }
.bloop_markdown table tr {
border-top: 1px solid #cccccc;
background-color: white;
margin: 0;
padding: 0; }
.bloop_markdown table tr:nth-child(2n) {
background-color: #f8f8f8; }
.bloop_markdown table tr th {
font-weight: bold;
border: 1px solid #cccccc;
margin: 0;
padding: 6px 13px; }
.bloop_markdown table tr td {
border: 1px solid #cccccc;
margin: 0;
padding: 6px 13px; }
.bloop_markdown table tr th :first-child, table tr td :first-child {
margin-top: 0; }
.bloop_markdown table tr th :last-child, table tr td :last-child {
margin-bottom: 0; }
.bloop_markdown blockquote{
border-left: 4px solid #dddddd;
padding: 0 15px;
color: #777777; }
blockquote > :first-child {
margin-top: 0; }
blockquote > :last-child {
margin-bottom: 0; }
code, pre, #ws, #message {
word-break: normal;
word-wrap: normal;
}
hr {
display: inherit;
}
.bloop_markdown :first-child {
-webkit-margin-before: 0;
}
code, pre, #ws, #message {
font-family: Menlo, Consolas, Liberation Mono, Courier, monospace;
}
.send { color:#77bb77; }
.server { color:#7799bb; }
.error { color:#AA0000; }</style><div class="bloop_markdown"><p>Hello Matthew, I have more more question about the generalized supertype constraints. Does the generalization also covers <code>inout</code>? I found a really annoying case with <code>inout</code>.</p>
<pre><code class="swift">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()`
</code></pre>
<p>Shouldn’t we allow <code>inout</code> to have subtypes as well, like <code>inout F : inout P</code>?</p>
<p>This is actually one of the pain points with the generic version of the <code>print</code> function. We cannot pass an arbitrary <code>TextOutputStream</code> to it without sacrificing the type. I doubt the generic <code>print</code> function is justified, because <code>TextOuputStream</code> does not have associated types nor a <code>Self</code> constraint. Furthermore it forces you to create a custom type-erased wrapper that can hold an arbitrary <code>TextOutputSteram</code>.</p>
<p>If this is part of a totally different topic, I’ll move it in it’s own thread. </p>
<p></p></div><div class="bloop_original_html"><style>body{font-family:Helvetica,Arial;font-size:13px}</style><div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px; color: rgba(0,0,0,1.0); margin: 0px; line-height: auto;"><br></div> <div id="bloop_sign_1512894629399404032" class="bloop_sign"></div> <br><p class="airmail_on">Am 2. Dezember 2017 um 19:03:24, Matthew Johnson via swift-evolution (<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>) schrieb:</p> <blockquote type="cite" class="clean_bq"><span><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div></div><div>
<title></title>
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.
<div class=""><br class=""></div>
<div class=""><br class="">
<div>
<blockquote type="cite" class="">
<div class="">On Nov 24, 2017, at 5:03 PM, Matthew Johnson via
swift-evolution <<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>> wrote:</div>
<br class="Apple-interchange-newline">
<div class="">
<div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">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
(<a href="https://twitter.com/anandabits/status/929958479598534656" class="">https://twitter.com/anandabits/status/929958479598534656</a>)
Doug Gregor mentioned that this feature is smaller and mostly
straightforward to design and implement (<a href="https://twitter.com/dgregor79/status/929975472779288576" class="">https://twitter.com/dgregor79/status/929975472779288576</a>).
<div class="">
<div class=""><br class=""></div>
<div class="">I currently have a PR open to add the high-level
description of this feature found below to the generics manifesto
(<a href="https://github.com/apple/swift/pull/13012" class="">https://github.com/apple/swift/pull/13012</a>):</div>
<div class=""><br class=""></div>
<div class="">
<div class="">Currently, supertype constraints may only be
specified using a concrete class or protocol type. This
prevents us from abstracting over the supertype.</div>
<div class=""><br class=""></div>
<div class="">```swift</div>
<div class="">protocol P {</div>
<div class=""> associatedtype Base</div>
<div class=""> associatedtype Derived: Base</div>
<div class="">}</div>
<div class="">```</div>
<div class=""><br class=""></div>
<div class="">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.</div>
<div class=""><br class=""></div>
<div class="">Generalized supertype constraints would be accepted
in all syntactic locations where generic constraints are
accepted.</div>
</div>
<div class=""><br class=""></div>
<div class="">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.</div>
<div class=""><br class=""></div>
<div class="">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?
<div class=""><br class=""></div>
<div class="">
<div class="">Matthew</div>
<div class="">
<div class=""><br class=""></div>
</div>
</div>
</div>
</div>
</div>
_______________________________________________<br class="">
swift-evolution mailing list<br class="">
<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a><br class="">
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br class=""></div>
</blockquote>
</div>
<br class=""></div>
_______________________________________________<br>swift-evolution mailing list<br><a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br><a href="https://lists.swift.org/mailman/listinfo/swift-evolution">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br></div></div></span></blockquote></div><div class="bloop_markdown"><p></p></div></div></blockquote><blockquote type="cite"><div><span>_______________________________________________</span><br><span>swift-evolution mailing list</span><br><span><a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a></span><br><span><a href="https://lists.swift.org/mailman/listinfo/swift-evolution">https://lists.swift.org/mailman/listinfo/swift-evolution</a></span><br></div></blockquote></div></body></html>