<html><head><style>body{font-family:Helvetica,Arial;font-size:13px}</style></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px; color: rgba(0,0,0,1.0); margin: 0px; line-height: auto;">Sorry for pushing this back, but I really would like to read any feedback for this idea of mine. ;)</div> <br> <div id="bloop_sign_1462989871917499136" class="bloop_sign"><div style="font-family:helvetica,arial;font-size:13px">-- <br>Adrian Zubarev<br>Sent with Airmail</div></div> <br><p class="airmail_on">Am 4. Mai 2016 bei 22:38:33, Adrian Zubarev (<a href="mailto:adrian.zubarev@devandartist.com">adrian.zubarev@devandartist.com</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;"><div></div><div>
<title></title>
<div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px; color: rgba(0,0,0,1.0); margin: 0px; line-height: auto;">
<div id="bloop_customfont" style="margin: 0px;">This one have
bothered me for days, since the idea came to my mind.</div>
<div id="bloop_customfont" style="margin: 0px;"><br></div>
<div id="bloop_customfont" style="margin: 0px;">I don't want to be
too futuristic so here are my first thoughts.</div>
<div id="bloop_customfont" style="margin: 0px;"><br></div>
<div id="bloop_customfont" style="margin: 0px;">What if Swift 3
would have the ability to merge types and protocols together?</div>
<div id="bloop_customfont" style="margin: 0px;"><br></div>
<div id="bloop_customfont" style="margin: 0px;">Sure we will see
generic typealias in Swift 3 but it doesn't allow us merge value
types which conforms to specific protocols (if there is a
need).</div>
<div id="bloop_customfont" style="margin: 0px;"><br></div>
<div id="bloop_customfont" style="margin: 0px;">protocol
SomeProtocol {</div>
<div id="bloop_customfont" style="margin: 0px;"></div>
<div id="bloop_customfont" style="margin: 0px;">func boo()</div>
<div id="bloop_customfont" style="margin: 0px;">}</div>
<div id="bloop_customfont" style="margin: 0px;"><br></div>
<div id="bloop_customfont" style="margin: 0px;">// this use-case
can be solved with generic typealias in Swift 3 (at least for
classes), but it is not the only one usecase of type merging</div>
<div id="bloop_customfont" style="margin: 0px;">func
foo(mergedInstance: type<UIView, SomeProtocol>) {</div>
<div id="bloop_customfont" style="margin: 0px;"></div>
<div id="bloop_customfont" style="margin: 0px;">
mergedInstance.removeFromSuperview() // just for the example</div>
<div id="bloop_customfont" style="margin: 0px;">
mergedInstance.boo()</div>
<div id="bloop_customfont" style="margin: 0px;">}</div>
<div id="bloop_customfont" style="margin: 0px;"><br></div>
<div id="bloop_customfont" style="margin: 0px;">extension UIButton:
SomeProtocol { /* implemnt boo() */ }</div>
<div id="bloop_customfont" style="margin: 0px;"><br></div>
<div id="bloop_customfont" style="margin: 0px;">let button:
SomeProtocol = UIButton() // decouple UIButton first</div>
<div id="bloop_customfont" style="margin: 0px;"><br></div>
<div id="bloop_customfont" style="margin: 0px;">Ok now I want to
use one instance as SomeProtocol and UIView.</div>
<div id="bloop_customfont" style="margin: 0px;"><br></div>
<div id="bloop_customfont" style="margin: 0px;">// another possible
use-case</div>
<div id="bloop_customfont" style="margin: 0px;">if let mergedView =
button as? type<UIView, SomeProtocol> {</div>
<div id="bloop_customfont" style="margin: 0px;"></div>
<div id="bloop_customfont" style="margin: 0px;">
mergedView.removeFromSuperview() // just for the example</div>
<div id="bloop_customfont" style="margin: 0px;">
mergedView.boo()</div>
<div id="bloop_customfont" style="margin: 0px;">}</div>
<div id="bloop_customfont" style="margin: 0px;"><br></div>
<div id="bloop_customfont" style="margin: 0px;">More detailed
design:</div>
<div id="bloop_customfont" style="margin: 0px;"><br></div>
<div id="bloop_customfont" style="margin: 0px;">- type<> can
contain only one value or reference type and n protocols</div>
<div id="bloop_customfont" style="margin: 0px;">- value or
reference type should always be the first type</div>
<div id="bloop_customfont" style="margin: 0px;">- type<>
should always contain at least 2 types (one value or reference type
and min. one protocol)</div>
<div id="bloop_customfont" style="margin: 0px;">- reference types
does represent one possible super/base type of the actuall
type </div>
<div id="bloop_customfont" style="margin: 0px;">
* class A {}</div>
<div id="bloop_customfont" style="margin: 0px;">
* class B: A {}</div>
<div id="bloop_customfont" style="margin: 0px;">
* class C: B {}</div>
<div id="bloop_customfont" style="margin: 0px;">
* possible types for B and C: type<B, AnyProtocolType,
...> or type<A, AnyProtocolType, ...></div>
<div id="bloop_customfont" style="margin: 0px;">- the
dynamicType/Self instance passed to type<> conforms to all
protocols type<> contains</div>
<div id="bloop_customfont" style="margin: 0px;"><br></div>
<div id="bloop_customfont" style="margin: 0px;">If there is more
rules one would apply to this idea feel free to discuss them
here.</div>
</div>
<br>
<div id="bloop_sign_1462393281052855040" class="bloop_sign">
<div style="font-family:helvetica,arial;font-size:13px">
-- <br>
Adrian Zubarev<br>
Sent with Airmail</div>
</div>
</div></div></span></blockquote></body></html>