<div dir="ltr">Thanks for all the feedback everyone, I just submitted a short proposal as a PR: <a href="https://github.com/apple/swift-evolution/pull/782">https://github.com/apple/swift-evolution/pull/782</a></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Jan 12, 2018 at 11:34 PM, Anders Kierulf via swift-evolution <span dir="ltr">&lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I also avoid using ! for negation when possible, and `toggle` or `invert` will be helpful, but in many cases I think the negative case is better expressed directly. For example, I find that using `nonEmpty` instead of !isEmpty makes the code easier to read:<br>
<br>
  extension String {<br>
      var nonEmpty: Bool { return !self.isEmpty }<br>
  }<br>
<br>
  if !string.isEmpty { … }<br>
<br>
  if string.isEmpty.inverted() { … }<br>
<br>
  if string.nonEmpty { … }<br>
<br>
For the case of `contains`, maybe define `lacks`?<br>
<span class=""><br>
  if !items.contains(item) { ... }<br>
<br>
  if items.contains(item).inverted(<wbr>) { ... }<br>
<br>
</span>  if items.lacks(item) { ... }<br>
<br>
Anders Kierulf<br>
<div class="HOEnZb"><div class="h5"><br>
&gt; On Jan 12, 2018, at 12:54 PM, Alejandro Martinez via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br>
&gt;<br>
&gt; I wouldn&#39;t go as far as to ask to fade out ! but in all my code I end<br>
&gt; up doing == false just for readability. That ! knows who to hide<br>
&gt; himself too well :P<br>
&gt;<br>
&gt; On Fri, Jan 12, 2018 at 10:13 AM, Adrian Zubarev via swift-evolution<br>
&gt; &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br>
&gt;&gt; I’m not sure if this would be considered or not, but I would like if the<br>
&gt;&gt; negation operator `!` would fade out.<br>
&gt;&gt;<br>
&gt;&gt; If this is ever going to a review then I’d suggest that we add a pair of<br>
&gt;&gt; functions, one mutating and the other non-mutating.<br>
&gt;&gt;<br>
&gt;&gt; extension Bool {<br>
&gt;&gt;  mutating func invert() {<br>
&gt;&gt;    self = !self<br>
&gt;&gt;  }<br>
&gt;&gt;<br>
&gt;&gt;  func inverted() {<br>
&gt;&gt;    return !self<br>
&gt;&gt;  }<br>
&gt;&gt; }<br>
&gt;&gt;<br>
&gt;&gt; I’d rather use `inverted` instead of `!` because of the readability this<br>
&gt;&gt; function provides.<br>
&gt;&gt;<br>
&gt;&gt; if !items.contains(item) { ... }<br>
&gt;&gt;<br>
&gt;&gt; if items.contains(item).inverted(<wbr>) { ... }<br>
&gt;&gt;<br>
&gt;&gt; ——<br>
&gt;&gt;<br>
&gt;&gt; I personally have some other extensions like:<br>
&gt;&gt;<br>
&gt;&gt; extension Bool {<br>
&gt;&gt;  @discardableResult<br>
&gt;&gt;  func whenTrue&lt;T&gt;(execute closure: () throws -&gt; T) rethrows -&gt; T? {<br>
&gt;&gt;    if self { return try closure() }<br>
&gt;&gt;    return nil<br>
&gt;&gt;  }<br>
&gt;&gt;<br>
&gt;&gt;  @discardableResult<br>
&gt;&gt;  func whenFalse&lt;T&gt;(execute closure: () throws -&gt; T) rethrows -&gt; T? {<br>
&gt;&gt;    if !self { return try closure() }<br>
&gt;&gt;    return nil<br>
&gt;&gt;  }<br>
&gt;&gt; }<br>
&gt;&gt;<br>
&gt;&gt; But this is more a personal preference.<br>
&gt;&gt;<br>
&gt;&gt; ——<br>
&gt;&gt;<br>
&gt;&gt; That said, if the community is fine with the `invert/inverted` pair then I’d<br>
&gt;&gt; say go for it ;)<br>
&gt;&gt;<br>
&gt;&gt; Am 12. Januar 2018 um 09:14:22, Nate Cook via swift-evolution<br>
&gt;&gt; (<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>) schrieb:<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; On Jan 12, 2018, at 12:15 AM, Chris Eidhof via swift-evolution<br>
&gt;&gt; &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt; Hey SE!<br>
&gt;&gt;<br>
&gt;&gt; When we have a bunch of nested structs:<br>
&gt;&gt;<br>
&gt;&gt;    struct Sample {<br>
&gt;&gt;        var bar: Bar<br>
&gt;&gt;    }<br>
&gt;&gt;<br>
&gt;&gt;    struct Bar {<br>
&gt;&gt;        var show: Bool<br>
&gt;&gt;    }<br>
&gt;&gt;<br>
&gt;&gt;    var foo = Sample(bar: Bar(show: false))<br>
&gt;&gt;<br>
&gt;&gt; It can be repetitive to toggle a deeply nested boolean:<br>
&gt;&gt;<br>
&gt;&gt;    foo.bar.show = !foo.bar.show // duplication<br>
&gt;&gt;<br>
&gt;&gt; I sometimes add a `toggle` extension on `Bool`<br>
&gt;&gt;<br>
&gt;&gt;    extension Bool {<br>
&gt;&gt;        mutating func toggle() {<br>
&gt;&gt;            self = !self<br>
&gt;&gt;        }<br>
&gt;&gt;    }<br>
&gt;&gt;<br>
&gt;&gt; This allows you to write the same code without duplication, and makes the<br>
&gt;&gt; intent clearer:<br>
&gt;&gt;<br>
&gt;&gt;    foo.bar.show.toggle()<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; I like it!<br>
&gt;&gt;<br>
&gt;&gt; In other languages, I don&#39;t think the `toggle` would make as much sense, but<br>
&gt;&gt; the mutable self makes this very useful.<br>
&gt;&gt;<br>
&gt;&gt; After I posted it on Twitter, it turns out I&#39;m not the only one:<br>
&gt;&gt; <a href="https://twitter.com/PublicExtension/status/730434956376346624" rel="noreferrer" target="_blank">https://twitter.com/<wbr>PublicExtension/status/<wbr>730434956376346624</a><br>
&gt;&gt;<br>
&gt;&gt; I would have gone straight to a proposal, but I think we can do some<br>
&gt;&gt; bikeshedding about the name of `toggle`?<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; Another verb that could work is `invert`.<br>
&gt;&gt;<br>
&gt;&gt; The `!` operator that does this is the negation operator, but I think<br>
&gt;&gt; `negate` could sound to some like &quot;make this false&quot; rather than toggling.<br>
&gt;&gt;<br>
&gt;&gt; Nate<br>
&gt;&gt; ______________________________<wbr>_________________<br>
&gt;&gt; swift-evolution mailing list<br>
&gt;&gt; <a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br>
&gt;&gt; <a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/<wbr>mailman/listinfo/swift-<wbr>evolution</a><br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; ______________________________<wbr>_________________<br>
&gt;&gt; swift-evolution mailing list<br>
&gt;&gt; <a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br>
&gt;&gt; <a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/<wbr>mailman/listinfo/swift-<wbr>evolution</a><br>
&gt;&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; --<br>
&gt; Alejandro Martinez<br>
&gt; <a href="http://alejandromp.com" rel="noreferrer" target="_blank">http://alejandromp.com</a><br>
&gt; ______________________________<wbr>_________________<br>
&gt; swift-evolution mailing list<br>
&gt; <a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br>
&gt; <a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/<wbr>mailman/listinfo/swift-<wbr>evolution</a><br>
<br>
______________________________<wbr>_________________<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" rel="noreferrer" target="_blank">https://lists.swift.org/<wbr>mailman/listinfo/swift-<wbr>evolution</a><br>
</div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature" data-smartmail="gmail_signature">Chris Eidhof</div>
</div>