<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Jan 17, 2017, at 2:14 PM, Haravikk &lt;<a href="mailto:swift-evolution@haravikk.me" class="">swift-evolution@haravikk.me</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="Content-Type" content="text/html charset=utf-8" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><br class=""><div class=""><blockquote type="cite" class=""><div class="">On 17 Jan 2017, at 09:57, David Sweeris via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="content-type" content="text/html; charset=utf-8" class=""><div dir="auto" class=""><div class=""><br class=""></div><div class="">On Jan 17, 2017, at 03:40, Charlie Monroe via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; wrote:<br class=""><br class=""></div><blockquote type="cite" class=""><div class=""><meta http-equiv="Content-Type" content="text/html charset=us-ascii" class=""><div dir="auto" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div dir="auto" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div dir="auto" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">I've come across multiple cases, where you simply know the array is never empty and hence the optionality on first, last and behavior of a few other members is slightly different. Also, there are cases where you want to declare that you shouldn't pass an empty array e.g. into&nbsp;an initializer.</div><div dir="auto" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class=""><br class=""></div><div class="">I was wondering whether Swift could have a specialized NonEmptyArray that could be used throughout the stdlib - e.g.&nbsp;<span style="font-family: Menlo; font-size: 9px;" class="">String.components(separatedBy:)</span>&nbsp;would return NonEmptyArray.</div><div class=""><br class=""></div><div class="">Thoughts?</div></div></div></div></div></blockquote><br class=""><div class="">I've tried to make such a type a few times... The struct itself isn't hard ("var first:T; var tail:[T]"), but I never could figure out how to make `NonEmptyArray` conform to `ExpressibleByArrayLiteral` (because the protocol doesn't allow for failable inits) without just crashing if there wasn't at least one element.</div><div class=""><br class=""></div><div class="">Anyway, I'm not opposed to adding it, as long as there's a non-crashy way to assign array literals to them.</div></div></div></blockquote></div><br class=""><div class="">Is a failable initialiser the way to go? Could we do something with some kind of compiler attribute?</div><div class=""><br class=""></div><div class="">For example:</div><div class=""><br class=""></div><div class=""><font face="Monaco" class=""><span class="Apple-tab-span" style="white-space:pre">        </span>struct MyNonEmptyArray&lt;E&gt; : ExpressibleByArrayLiteral {</font></div><div class=""><font face="Monaco" class=""><span class="Apple-tab-span" style="white-space:pre">                </span>typealias Element = E</font></div><div class=""><font face="Monaco" class=""><span class="Apple-tab-span" style="white-space:pre">                </span>@minParameters(1) init(arrayLiteral:Element…) { â€¦ }</font></div><div class=""><font face="Monaco" class=""><span class="Apple-tab-span" style="white-space:pre">        </span>}</font></div><div class=""><br class=""></div><div class="">In this case the @minParameters attribute tells the compiler how many parameters must be present in direct calls to this method, however, for cases where this isn't possible to check it would still trigger a runtime error, but that would only be for more unusual cases like trying to handle this type as a generic ExpressibleByArrayLiteral.</div></div></div></blockquote><div><br class=""></div><div>I personally agree that I wouldn't make it failable. The compiler should be able to detect making of a NonEmptyArray with 0 literals and there's nothing against marking an empty initializer as @available(*, unavailable) - it will conform to the necessary protocols, but you won't be able to invoke it.</div><br class=""><blockquote type="cite" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">Just trying to think whether there might be a more flexible way to do this, as if you can support arrays with at least 1 element, then why not 2 or 3 etc.? In the worst case this would just become a runtime error, which is how we would have to handle right now, but in more common cases the compiler can give an error right away.</div></div></blockquote><br class=""></div><div>I have thought about this, but to be honest, even math-wise, an empty set (or array) is a special case... So I began wondering whether it would make sense to add something that explicitely states that the array is not empty. If I'm not mistaken, since it would change the return type of a few stdlib methods, the time to discuss it would be now...</div><div><br class=""></div><div>It's true that you can handle this with assertions, as I've noted, was just wondering if there's a better way...</div><div><br class=""></div><br class=""></body></html>