<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Title" content="">
<meta name="Keywords" content="">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Courier New";
        panose-1:2 7 3 9 2 2 5 2 4 4;}
@font-face
        {font-family:Wingdings;
        panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Menlo;
        panose-1:2 11 6 9 3 8 4 2 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:Calibri;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
        {mso-style-priority:34;
        margin-top:0cm;
        margin-right:0cm;
        margin-bottom:0cm;
        margin-left:36.0pt;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:Calibri;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:Calibri;
        color:windowtext;}
span.msoIns
        {mso-style-type:export-only;
        mso-style-name:"";
        text-decoration:underline;
        color:teal;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:Calibri;}
@page WordSection1
        {size:595.0pt 842.0pt;
        margin:70.85pt 70.85pt 70.85pt 70.85pt;}
div.WordSection1
        {page:WordSection1;}
/* List Definitions */
@list l0
        {mso-list-id:4866575;
        mso-list-type:hybrid;
        mso-list-template-ids:-434492334 67698689 67698691 67698693 67698689 67698691 67698693 67698689 67698691 67698693;}
@list l0:level1
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Symbol;}
@list l0:level2
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Courier New","serif";}
@list l0:level3
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
@list l0:level4
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Symbol;}
@list l0:level5
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Courier New","serif";}
@list l0:level6
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
@list l0:level7
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Symbol;}
@list l0:level8
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Courier New","serif";}
@list l0:level9
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
@list l1
        {mso-list-id:766195935;
        mso-list-type:hybrid;
        mso-list-template-ids:146558298 67698689 67698691 67698693 67698689 67698691 67698693 67698689 67698691 67698693;}
@list l1:level1
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Symbol;}
@list l1:level2
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Courier New","serif";}
@list l1:level3
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
@list l1:level4
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Symbol;}
@list l1:level5
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Courier New","serif";}
@list l1:level6
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
@list l1:level7
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Symbol;}
@list l1:level8
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Courier New","serif";}
@list l1:level9
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
ol
        {margin-bottom:0cm;}
ul
        {margin-bottom:0cm;}
--></style>
</head>
<body bgcolor="white" lang="EN-US" link="#0563C1" vlink="#954F72">
<div class="WordSection1">
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:11.0pt">Hi All,<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:11.0pt"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:11.0pt">Using protocols are quite important in case of “plugin” concept to implement delegation: allow others to implement small components which will be run in specific cases.<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:11.0pt">To support one component a delegate or closure is sufficient. For the delegate we can use the protocol as referenced type unless it has associated type. If it uses associated type
 we can still use Generics to reference the object and use protocol only for constraints.
<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:11.0pt">Allowing more components to subscribe causes the problem that we cannot reference them:<o:p></o:p></span></p>
<p class="MsoListParagraph" style="text-indent:-18.0pt;mso-list:l0 level1 lfo1;text-autospace:none">
<![if !supportLists]><span style="font-size:11.0pt;font-family:Symbol"><span style="mso-list:Ignore">·<span style="font:7.0pt &quot;Times New Roman&quot;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><![endif]><span style="font-size:11.0pt">We cannot use generics as there can be any arbitrary number and type of objects so we have to use protocols to reference them<o:p></o:p></span></p>
<p class="MsoListParagraph" style="text-indent:-18.0pt;mso-list:l0 level1 lfo1;text-autospace:none">
<![if !supportLists]><span style="font-size:11.0pt;font-family:Symbol"><span style="mso-list:Ignore">·<span style="font:7.0pt &quot;Times New Roman&quot;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><![endif]><span style="font-size:11.0pt">When there is an associatedtype in the protocol it is not possible to use to reference objects<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:11.0pt"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:11.0pt">For example:<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:11.0pt">We have a generic class which holds a collection of some type of objects – the generic parameter is a type of an item.<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:11.0pt">This class exposes a kind of delegate (specified by a protocol) and arbitrary number of implementers can subscribe. These delegates will be called in a specific case: for example
 when a new item is added to the collection.<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:11.0pt">The defined protocol uses associatedtype since the specific type of element is unkown.<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:11.0pt">The problem that the code cannot compile because of the error: &quot;protocol 'SomeProtocol' can only be used as a generic constraint because it has Self or associated type requirements&quot;&nbsp;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:11.0pt"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:11.0pt">So we know the specific element we want to store but still cannot specify it. We cannot use generic for the ‘delegates’ as it should contain different implementations of SomeProtocol.<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:11.0pt"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:11.0pt"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:8.0pt;font-family:Menlo;color:blue">protocol</span><span style="font-size:8.0pt;font-family:Menlo;color:black"> SomeProtocol {<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:8.0pt;font-family:Menlo;color:black">&nbsp;&nbsp;&nbsp;
</span><span style="font-size:8.0pt;font-family:Menlo;color:blue">associatedtype</span><span style="font-size:8.0pt;font-family:Menlo;color:black"> ElementType<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:8.0pt;font-family:Menlo;color:black">&nbsp;&nbsp;&nbsp;
<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:8.0pt;font-family:Menlo;color:black">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size:8.0pt;font-family:Menlo;color:blue">func</span><span style="font-size:8.0pt;font-family:Menlo;color:black"> someMethod(withElement:
 ElementType) -&gt; </span><span style="font-size:8.0pt;font-family:Menlo;color:#2B839F">Void</span><span style="font-size:8.0pt;font-family:Menlo;color:black"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:8.0pt;font-family:Menlo;color:black">}<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:8.0pt;font-family:Menlo;color:black"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:8.0pt;font-family:Menlo;color:blue">class</span><span style="font-size:8.0pt;font-family:Menlo;color:black"> SomeProtocolImplInt :
</span><span style="font-size:8.0pt;font-family:Menlo;color:#2B839F">SomeProtocol</span><span style="font-size:8.0pt;font-family:Menlo;color:black"> {<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:8.0pt;font-family:Menlo;color:black">&nbsp;&nbsp;&nbsp;
</span><span style="font-size:8.0pt;font-family:Menlo;color:blue">typealias</span><span style="font-size:8.0pt;font-family:Menlo;color:black"> ElementType =
</span><span style="font-size:8.0pt;font-family:Menlo;color:#2B839F">Int</span><span style="font-size:8.0pt;font-family:Menlo;color:black"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:8.0pt;font-family:Menlo;color:black">&nbsp;&nbsp; &nbsp;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:8.0pt;font-family:Menlo;color:black">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size:8.0pt;font-family:Menlo;color:blue">var</span><span style="font-size:8.0pt;font-family:Menlo;color:black"> sum :
</span><span style="font-size:8.0pt;font-family:Menlo;color:#2B839F">Int</span><span style="font-size:8.0pt;font-family:Menlo;color:black"> = 0<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:8.0pt;font-family:Menlo;color:black">&nbsp;&nbsp;&nbsp;
<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:8.0pt;font-family:Menlo;color:black">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size:8.0pt;font-family:Menlo;color:blue">func</span><span style="font-size:8.0pt;font-family:Menlo;color:black"> someMethod(withElement
 element: </span><span style="font-size:8.0pt;font-family:Menlo;color:#2B839F">Int</span><span style="font-size:8.0pt;font-family:Menlo;color:black">) {<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:8.0pt;font-family:Menlo;color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span><span style="font-size:8.0pt;font-family:Menlo;color:#2B839F">sum</span><span style="font-size:8.0pt;font-family:Menlo;color:black"> &#43;= element<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:8.0pt;font-family:Menlo;color:black">&nbsp;&nbsp;&nbsp; }<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:8.0pt;font-family:Menlo;color:black">}<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:8.0pt;font-family:Menlo;color:black"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:8.0pt;font-family:Menlo;color:blue">class</span><span style="font-size:8.0pt;font-family:Menlo;color:black"> Container&lt;SomeElementType&gt;&nbsp; {<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:8.0pt;font-family:Menlo;color:black">&nbsp;&nbsp;&nbsp;
</span><span style="font-size:8.0pt;font-family:Menlo;color:blue">typealias</span><span style="font-size:8.0pt;font-family:Menlo;color:black"> ElementType =
</span><span style="font-size:8.0pt;font-family:Menlo;color:#2B839F">SomeElementType</span><span style="font-size:8.0pt;font-family:Menlo;color:black"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:8.0pt;font-family:Menlo;color:black">&nbsp;&nbsp;&nbsp;
<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:8.0pt;font-family:Menlo;color:black">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size:8.0pt;font-family:Menlo;color:blue">var</span><span style="font-size:8.0pt;font-family:Menlo;color:black"> elements
 = </span><span style="font-size:8.0pt;font-family:Menlo;color:#2B839F">Array</span><span style="font-size:8.0pt;font-family:Menlo;color:black">&lt;</span><span style="font-size:8.0pt;font-family:Menlo;color:#2B839F">SomeElementType</span><span style="font-size:8.0pt;font-family:Menlo;color:black">&gt;()<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:8.0pt;font-family:Menlo;color:black">&nbsp;&nbsp;&nbsp;
<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:8.0pt;font-family:Menlo;color:black">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size:8.0pt;font-family:Menlo;color:blue">var</span><span style="font-size:8.0pt;font-family:Menlo;color:black"> delegates
 = </span><span style="font-size:8.0pt;font-family:Menlo;color:#2B839F">Array</span><span style="font-size:8.0pt;font-family:Menlo;color:black">&lt;</span><span style="font-size:8.0pt;font-family:Menlo;color:#2B839F">SomeProtocol</span><span style="font-size:8.0pt;font-family:Menlo;color:black">
</span><span style="font-size:8.0pt;font-family:Menlo;color:blue">where</span><span style="font-size:8.0pt;font-family:Menlo;color:black"> SomeProtocol.ElementType==SomeElementType&gt;() // ‘where’ could solve the problem but not allowed here<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:8.0pt;font-family:Menlo;color:black">&nbsp;&nbsp;&nbsp;
<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:8.0pt;font-family:Menlo;color:black">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size:8.0pt;font-family:Menlo;color:blue">func</span><span style="font-size:8.0pt;font-family:Menlo;color:black"> subscribe&lt;D
 : </span><span style="font-size:8.0pt;font-family:Menlo;color:#2B839F">SomeProtocol</span><span style="font-size:8.0pt;font-family:Menlo;color:black">&gt;(delegate :
</span><span style="font-size:8.0pt;font-family:Menlo;color:#2B839F">D</span><span style="font-size:8.0pt;font-family:Menlo;color:black">)
</span><span style="font-size:8.0pt;font-family:Menlo;color:blue">where</span><span style="font-size:8.0pt;font-family:Menlo;color:black">
</span><span style="font-size:8.0pt;font-family:Menlo;color:#2B839F">D</span><span style="font-size:8.0pt;font-family:Menlo;color:black">.ElementType==</span><span style="font-size:8.0pt;font-family:Menlo;color:#2B839F">SomeElementType</span><span style="font-size:8.0pt;font-family:Menlo;color:black">
 { // would be better without generics as this generates as many methods as many different types used to call it<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:8.0pt;font-family:Menlo;color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delegates.append(delegate)<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:8.0pt;font-family:Menlo;color:black">&nbsp;&nbsp;&nbsp; }<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:8.0pt;font-family:Menlo;color:black">&nbsp;&nbsp;&nbsp;
<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:8.0pt;font-family:Menlo;color:black">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size:8.0pt;font-family:Menlo;color:blue">func</span><span style="font-size:8.0pt;font-family:Menlo;color:black"> add(element:
</span><span style="font-size:8.0pt;font-family:Menlo;color:#2B839F">SomeElementType</span><span style="font-size:8.0pt;font-family:Menlo;color:black">) {<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:8.0pt;font-family:Menlo;color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:8.0pt;font-family:Menlo;color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size:8.0pt;font-family:Menlo;color:blue">for</span><span style="font-size:8.0pt;font-family:Menlo;color:black"> delegate
</span><span style="font-size:8.0pt;font-family:Menlo;color:blue">in</span><span style="font-size:8.0pt;font-family:Menlo;color:black"> delegates {<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:8.0pt;font-family:Menlo;color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delegate.someMethod(withElement: element)<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:8.0pt;font-family:Menlo;color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:8.0pt;font-family:Menlo;color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span><span style="font-size:8.0pt;font-family:Menlo;color:#2B839F">elements</span><span style="font-size:8.0pt;font-family:Menlo;color:black">.</span><span style="font-size:8.0pt;font-family:Menlo;color:#2B839F">append</span><span style="font-size:8.0pt;font-family:Menlo;color:black">(element)<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:8.0pt;font-family:Menlo;color:black">&nbsp;&nbsp;&nbsp; }<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:8.0pt;font-family:Menlo;color:black">}<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:11.0pt"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:11.0pt">// usage:<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:8.0pt;font-family:Menlo;color:blue">var</span><span style="font-size:8.0pt;font-family:Menlo;color:black"> container =
</span><span style="font-size:8.0pt;font-family:Menlo;color:#2B839F">Container</span><span style="font-size:8.0pt;font-family:Menlo;color:black">&lt;</span><span style="font-size:8.0pt;font-family:Menlo;color:#2B839F">Int</span><span style="font-size:8.0pt;font-family:Menlo;color:black">&gt;()<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:8.0pt;font-family:Menlo;color:blue">let</span><span style="font-size:8.0pt;font-family:Menlo;color:black"> calculator =
</span><span style="font-size:8.0pt;font-family:Menlo;color:#2B839F">SomeProtocolImplInt</span><span style="font-size:8.0pt;font-family:Menlo;color:black">()<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:8.0pt;font-family:Menlo;color:black">container.</span><span style="font-size:8.0pt;font-family:Menlo;color:#2B839F">subscribe</span><span style="font-size:8.0pt;font-family:Menlo;color:black">(delegate:
 calculator)<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:8.0pt;font-family:Menlo;color:black">container.</span><span style="font-size:8.0pt;font-family:Menlo;color:#2B839F">add</span><span style="font-size:8.0pt;font-family:Menlo;color:black">(element:
 1)<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:11.0pt"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><o:p>&nbsp;</o:p></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:11.0pt">Workaround:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">Use 'Thunks'. These are type eraser structs, which implements the same protocol. For each method they referencing (capturing) the original methods and properties of the object. So 'thunks' are technically
 proxy objects. </span><span style="font-size:8.0pt"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:8.0pt"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:8.0pt;font-family:Menlo;color:blue">struct</span><span style="font-size:8.0pt;font-family:Menlo;color:black"> DirtyThunk&lt;SomeElementType&gt; :
</span><span style="font-size:8.0pt;font-family:Menlo;color:#2B839F">SomeProtocol</span><span style="font-size:8.0pt;font-family:Menlo;color:black"> {<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:8.0pt;font-family:Menlo;color:black">&nbsp;&nbsp;&nbsp;
<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:8.0pt;font-family:Menlo;color:black">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size:8.0pt;font-family:Menlo;color:blue">private</span><span style="font-size:8.0pt;font-family:Menlo;color:black">
</span><span style="font-size:8.0pt;font-family:Menlo;color:blue">let</span><span style="font-size:8.0pt;font-family:Menlo;color:black"> _someMethod : (</span><span style="font-size:8.0pt;font-family:Menlo;color:#2B839F">SomeElementType</span><span style="font-size:8.0pt;font-family:Menlo;color:black">)
 -&gt; </span><span style="font-size:8.0pt;font-family:Menlo;color:#2B839F">Void</span><span style="font-size:8.0pt;font-family:Menlo;color:black"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:8.0pt;font-family:Menlo;color:black">&nbsp;&nbsp;&nbsp;
<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:8.0pt;font-family:Menlo;color:black">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size:8.0pt;font-family:Menlo;color:blue">init</span><span style="font-size:8.0pt;font-family:Menlo;color:black">&lt;D :
</span><span style="font-size:8.0pt;font-family:Menlo;color:#2B839F">SomeProtocol</span><span style="font-size:8.0pt;font-family:Menlo;color:black">&gt;(delegate :
</span><span style="font-size:8.0pt;font-family:Menlo;color:#2B839F">D</span><span style="font-size:8.0pt;font-family:Menlo;color:black">)
</span><span style="font-size:8.0pt;font-family:Menlo;color:blue">where</span><span style="font-size:8.0pt;font-family:Menlo;color:black">
</span><span style="font-size:8.0pt;font-family:Menlo;color:#2B839F">D</span><span style="font-size:8.0pt;font-family:Menlo;color:black">.ElementType==</span><span style="font-size:8.0pt;font-family:Menlo;color:#2B839F">SomeElementType</span><span style="font-size:8.0pt;font-family:Menlo;color:black">
 {<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:8.0pt;font-family:Menlo;color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span><span style="font-size:8.0pt;font-family:Menlo;color:#2B839F">_someMethod</span><span style="font-size:8.0pt;font-family:Menlo;color:black"> = delegate.</span><span style="font-size:8.0pt;font-family:Menlo;color:#2B839F">someMethod</span><span style="font-size:8.0pt;font-family:Menlo;color:black"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:8.0pt;font-family:Menlo;color:black">&nbsp;&nbsp;&nbsp; }<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:8.0pt;font-family:Menlo;color:black">&nbsp;&nbsp;&nbsp;
<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:8.0pt;font-family:Menlo;color:black">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size:8.0pt;font-family:Menlo;color:blue">func</span><span style="font-size:8.0pt;font-family:Menlo;color:black"> someMethod(withElement:
</span><span style="font-size:8.0pt;font-family:Menlo;color:#2B839F">SomeElementType</span><span style="font-size:8.0pt;font-family:Menlo;color:black">) {<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:8.0pt;font-family:Menlo;color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span><span style="font-size:8.0pt;font-family:Menlo;color:#2B839F">_someMethod</span><span style="font-size:8.0pt;font-family:Menlo;color:black">(withElement)<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:8.0pt;font-family:Menlo;color:black">&nbsp;&nbsp;&nbsp; }<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:8.0pt;font-family:Menlo;color:black">}<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">the subscribe method will be modified:<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:8.0pt;font-family:Menlo;color:blue">func</span><span style="font-size:8.0pt;font-family:Menlo;color:black"> subscribe&lt;D :
</span><span style="font-size:8.0pt;font-family:Menlo;color:#2B839F">SomeProtocol</span><span style="font-size:8.0pt;font-family:Menlo;color:black">&gt;(delegate :
</span><span style="font-size:8.0pt;font-family:Menlo;color:#2B839F">D</span><span style="font-size:8.0pt;font-family:Menlo;color:black">)
</span><span style="font-size:8.0pt;font-family:Menlo;color:blue">where</span><span style="font-size:8.0pt;font-family:Menlo;color:black">
</span><span style="font-size:8.0pt;font-family:Menlo;color:#2B839F">D</span><span style="font-size:8.0pt;font-family:Menlo;color:black">.ElementType==</span><span style="font-size:8.0pt;font-family:Menlo;color:#2B839F">SomeElementType</span><span style="font-size:8.0pt;font-family:Menlo;color:black">
 { // would be better without generics as this generates as many methods as many different types used to call it<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:8.0pt;font-family:Menlo;color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; let thunk = DirtyThunk(delegate)<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:8.0pt;font-family:Menlo;color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delegates.append(thunk)<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:8.0pt;font-family:Menlo;color:black">&nbsp;&nbsp;&nbsp; }<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">This solution works - however we can never retrieve the original object any more as it is not referenced. The implementation of the “thunks” are also painful a bit. The methods are captured only by the name
 of the methods without the parameters so leads the problem if different methods have the same prefix.</span><span style="font-size:11.0pt"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">I tried to solve using ‘Any’ to reference the delegates but then cannot cast to a proper type to call them.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">Do one know any better solution?
<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">Thanks,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">Andras<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt"><o:p>&nbsp;</o:p></span></p>
</div>
</body>
</html>