<html><head><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></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><div class="bloop_markdown"><p>I will consider your advice, it’s actually a replay good one. :) I guess it was the iOS development influence from Objective-C that let me write such not swifty delegates.</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> <br> <div id="bloop_sign_1490770123776572928" class="bloop_sign"><div style="font-family:helvetica,arial;font-size:13px">--&nbsp;<br>Adrian Zubarev<br>Sent with Airmail</div></div> <br><p class="airmail_on">Am 29. März 2017 um 04:07:38, Slava Pestov (<a href="mailto:spestov@apple.com">spestov@apple.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;" class=""><div></div><div>



<title></title>


<br class="">
<div>
<blockquote type="cite" class="">
<div class="">On Mar 28, 2017, at 12:10 AM, Adrian Zubarev
&lt;<a href="mailto:adrian.zubarev@devandartist.com" class="">adrian.zubarev@devandartist.com</a>&gt; wrote:</div>
<br class="Apple-interchange-newline">
<div class="">
<div class="bloop_markdown" style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(254, 254, 254);">
<p style="margin: 15px 0px; -webkit-margin-before: 0px;" class="">
It’s probably the influence from iOS development where I have
delegate protocols like this one:</p>
<pre style="margin: 15px 0px; font-family: Menlo, Consolas, 'Liberation Mono', Courier, monospace; font-size: 10pt; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-color: rgb(248, 248, 248); color: inherit; border: 1px solid rgb(204, 204, 204); overflow: auto; padding: 4px 8px; word-break: normal; word-wrap: normal;" class=""><code class="swift" style="font-family: Menlo, Consolas, 'Liberation Mono', Courier, monospace; font-size: 10pt; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-color: rgb(248, 248, 248); color: inherit; border: 0px; margin: 0px; padding: 0px; word-break: normal; word-wrap: normal; -webkit-margin-before: 0px;">@objc public protocol _ContainerViewControllerDelegate: class {
      
    @objc optional func containerViewController(_ containerViewController: ContainerViewController,
                                                willPerform operation: ContainerViewController.Operation,
                                                from oldViewController: UIViewController,
                                                to newViewController: UIViewController,
                                                animated: Bool)
      
    @objc optional func containerViewController(_ containerViewController: ContainerViewController,
                                                didPerform operation: ContainerViewController.Operation,
                                                from oldViewController: UIViewController,
                                                to newViewController: UIViewController,
                                                animated: Bool)
      
    @objc optional func containerViewController(_ containerViewController: ContainerViewController,
                                                willSet oldViewControllers: [UIViewController],
                                                to newViewControllers: [UIViewController],
                                                animated: Bool)
      
    @objc optional func containerViewController(_ containerViewController: ContainerViewController,
                                                didSet newViewControllers: [UIViewController],
                                                from oldViewControllers: [UIViewController],
                                                animated: Bool)
}
</code></pre></div>
</div>
</blockquote>
<div><br class=""></div>
This looks like a bad API to begin with. If I was designing
something like this I would instead have a single
containerViewController() method or something that takes a value
which encodes the various states.</div>
<div><br class=""></div>
<div>You could have something like this:</div>
<div><br class=""></div>
<div>enum ViewControllerState {</div>
<div>&nbsp; case willPerform(…)</div>
<div>&nbsp; case didPerform(…)</div>
<div>&nbsp; case willSet(…)</div>
<div>&nbsp; case didSet(…)</div>
<div>}</div>
<div><br class=""></div>
<div>Slava<br class="">
<blockquote type="cite" class="">
<div class="">
<div class="bloop_markdown" style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(254, 254, 254);">
<p style="margin: 15px 0px;" class="">Implementing noops for each
function in an extension seems kind of a wrong decision for a few
reasons:</p>
<ul style="margin: 15px 0px;" class="">
<li style="margin: 15px 0px; -webkit-margin-before: 0px;" class="">
<p style="margin: 15px 0px; -webkit-margin-before: 0px;" class="">
They don’t make sense, because either the receiver implements a
function or not. So optional functions provide a more natural
solution to that problem.</p>
</li>
<li style="margin: 15px 0px;" class="">
<p style="margin: 15px 0px; -webkit-margin-before: 0px;" class="">
We don’t have to pass unnecessarily any arguments to the top
functions.</p>
</li>
<li style="margin: 15px 0px;" class="">
<p style="margin: 15px 0px; -webkit-margin-before: 0px;" class="">
(Personal preference) I tend to avoid<span class="Apple-converted-space">&nbsp;</span><code style="font-family: Menlo, Consolas, 'Liberation Mono', Courier, monospace; font-size: 10pt; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-color: rgb(248, 248, 248); color: inherit; border: 1px solid rgb(234, 234, 234); margin: 0px 2px; padding: 0px 5px; word-break: normal; word-wrap: normal; -webkit-margin-before: 0px;" class="">@objc</code><span class="Apple-converted-space">&nbsp;</span>in general.<span class="Apple-converted-space">&nbsp;</span></p>
</li>
</ul>
<p style="margin: 15px 0px;" class="">I think there was some
technical reason why we don’t have<span class="Apple-converted-space">&nbsp;</span><code style="font-family: Menlo, Consolas, 'Liberation Mono', Courier, monospace; font-size: 10pt; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-color: rgb(248, 248, 248); color: inherit; border: 1px solid rgb(234, 234, 234); margin: 0px 2px; padding: 0px 5px; word-break: normal; word-wrap: normal; -webkit-margin-before: 0px;" class="">optional</code><span class="Apple-converted-space">&nbsp;</span>functions in pure Swift yet,
something that also affects<span class="Apple-converted-space">&nbsp;</span><code style="font-family: Menlo, Consolas, 'Liberation Mono', Courier, monospace; font-size: 10pt; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-color: rgb(248, 248, 248); color: inherit; border: 1px solid rgb(234, 234, 234); margin: 0px 2px; padding: 0px 5px; word-break: normal; word-wrap: normal;" class="">dynamic</code><span class="Apple-converted-space">&nbsp;</span>if I’m not mistaken.</p>
<p style="margin: 15px 0px;" class="">Think of the protocol from
above as of an existential of a set of functions. The problem is
that, I don’t want to introduce a standalone protocol for every
function, so the client can decide which protocol it will conform
to to avoid these noops. Furthermore, it’s way easier to check for
an optional function in your control flow instead of dealing with
default values delegate functions with a more complex return type
might have.</p>
<div style="margin: 15px 0px;" class=""><br class="webkit-block-placeholder"></div>
</div>
<div class="bloop_original_html" style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(254, 254, 254);">
<div id="bloop_customfont" style="font-family: Helvetica, Arial; font-size: 13px; margin: 0px;" class=""><br class=""></div>
<br class="">
<div id="bloop_sign_1490683816095092992" class="bloop_sign">
<div style="font-family: helvetica, arial; font-size: 13px;" class="">--&nbsp;<br class="">
Adrian Zubarev<br class="">
Sent with Airmail</div>
</div>
<br class="">
<p class="airmail_on" style="margin: 15px 0px;">Am 28. März 2017 um
07:31:50, Slava Pestov (<a href="mailto:spestov@apple.com" style="color: rgb(65, 131, 196); background-color: inherit; text-decoration: none;" class="">spestov@apple.com</a>) schrieb:</p>
<blockquote type="cite" class="clean_bq" style="margin: 15px 0px;">
<div class="" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;">
<div class=""></div>
<div class=""><span style="margin-top: 0px; margin-bottom: 0px;" class=""><br class=""></span>
<div class="">
<blockquote type="cite" class="" style="margin: 15px 0px;">
<div class="" style="margin-top: 0px;"><span style="margin-top: 0px; margin-bottom: 0px;" class="">On Mar 27, 2017, at
1:48 PM, Adrian Zubarev via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="" style="color: rgb(65, 131, 196); background-color: inherit; text-decoration: none;">swift-evolution@swift.org</a>&gt;
wrote:</span></div>
<span style="margin-top: 0px; margin-bottom: 0px;" class=""><br class="Apple-interchange-newline"></span>
<div class="" style="margin-bottom: 0px;">
<div class="bloop_markdown" style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(254, 254, 254);">
<ul class="" style="margin: 15px 0px; -webkit-margin-before: 0px;">
<li class="" style="margin: 15px 0px; -webkit-margin-before: 0px;">
<p class="" style="margin: 15px 0px; -webkit-margin-before: 0px;">
<span style="margin-top: 0px; margin-bottom: 0px;" class="">Assuming we’ll get that functionality, both<span class="Apple-converted-space" style="-webkit-margin-before: 0px;">&nbsp;</span><code class="" style="font-family: Menlo, Consolas, 'Liberation Mono', Courier, monospace; font-size: 10pt; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-color: rgb(248, 248, 248); color: inherit; border: 1px solid rgb(234, 234, 234); margin: 0px 2px; padding: 0px 5px; word-break: normal; word-wrap: normal; -webkit-margin-before: 0px;">var</code><span class="Apple-converted-space">&nbsp;</span>and<span class="Apple-converted-space">&nbsp;</span><code class="" style="font-family: Menlo, Consolas, 'Liberation Mono', Courier, monospace; font-size: 10pt; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-color: rgb(248, 248, 248); color: inherit; border: 1px solid rgb(234, 234, 234); margin: 0px 2px; padding: 0px 5px; word-break: normal; word-wrap: normal;">let</code><span class="Apple-converted-space">&nbsp;</span>should
satisfy the protocol requirements right?</span></p>
</li>
</ul>
</div>
</div>
</blockquote>
In theory, there’s no reason not to allow that.</div>
<div class=""><br class="">
<blockquote type="cite" class="" style="margin: 15px 0px;">
<div class="bloop_markdown" style="margin-top: 0px; margin-bottom: 0px; font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(254, 254, 254);">
<ul class="" style="margin: 15px 0px; -webkit-margin-before: 0px;">
<li class="" style="margin: 15px 0px; -webkit-margin-before: 0px;">
<p class="" style="margin: 15px 0px; -webkit-margin-before: 0px;">
If it is valid, could we potentially get optional functions in pure
Swift as well?</p>
<div class=""><br class="" style="-webkit-margin-before: 0px;"></div>
</li>
</ul>
</div>
</blockquote>
I mean, you can already do this:</div>
<div class=""><br class=""></div>
<div class="">protocol P {</div>
<div class="">&nbsp; var optionalRequirement: ((Int) -&gt; ())? {
get }</div>
<div class="">}</div>
<div class=""><br class=""></div>
<div class="">extension P {</div>
<div class="">&nbsp; // “default implementation"</div>
<div class="">&nbsp; var optionalRequirement: ((Int) -&gt; ())? {
return nil }</div>
<div class="">}</div>
<div class=""><br class=""></div>
<div class="">struct A : P {}</div>
<div class=""><br class=""></div>
<div class="">struct B : P {</div>
<div class="">&nbsp; let optionalRequirement: ((Int) -&gt; ())? = {
(x: Int) in print(x) }</div>
<div class="">}</div>
<div class=""><br class=""></div>
<div class="">But it’s kind of tacky.</div>
<div class=""><br class=""></div>
<div class="">If you think about it, “optional requirement” is an
oxymoron. What’s your use-case?</div>
<div class=""><br class=""></div>
<div class="">Slava</div>
</div>
</div>
</blockquote>
</div>
<div class="bloop_markdown" style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(254, 254, 254);">
</div>
</div>
</blockquote>
</div>
<br class="">


</div></div></span></blockquote></div><div class="bloop_markdown"><p></p></div></body></html>