<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 20. Jun 2017, at 01:38, Muhammad Tahir Vali via swift-users &lt;<a href="mailto:swift-users@swift.org" class="">swift-users@swift.org</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class="">Hey all,<div class=""><br class=""></div><div class="">I wanted to know if theres a work around for a problem I am having</div><div class=""><br class=""></div><div class="">lets say I have a protocol&nbsp;</div><div class=""><br class=""></div><div class="">protocol <b class="">Graphable</b> : CustomStringConvertible, Sequence, Collection {</div><div class="">&nbsp; &nbsp; var vertices : [AnyVertexable] { get set }</div><div class=""><b class="">&nbsp; &nbsp; var edges: [AnyEdge]? { get set }</b></div><div class="">&nbsp; &nbsp; &nbsp;....</div><div class="">&nbsp; &nbsp; ....</div><div class="">}</div><div class=""><br class=""></div><div class="">Then I have 2 classes that inherit from them&nbsp;</div><div class=""><br class=""></div><div class="">class <b class="">EZUndirectedGraph</b> : Graphable {</div><div class="">&nbsp; &nbsp; var vertices : [AnyVertexable]&nbsp;</div><div class=""><b class="">&nbsp; &nbsp; var edges: [AnyEdge]?&nbsp;</b></div><div class="">&nbsp; &nbsp; &nbsp;.....</div><div class="">}</div><div class=""><br class=""></div><div class=""><div class="">class <b class="">EZDirectedGraph</b> : Graphable {</div><div class=""><div class="">&nbsp; &nbsp; var vertices : [AnyVertexable]</div><div class=""><b class="">&nbsp; &nbsp; var edges: [AnyEdge]?&nbsp;</b></div></div><div class=""><b class="">&nbsp; &nbsp; // </b>var edges : [AnyEdge]</div><div class="">&nbsp; &nbsp; ....</div><div class="">}</div></div><div class=""><br class=""></div><div class="">Is there a way for me to make the "edges" variable in "<b class="">EZDirectedGraph</b>" to NOT be an optional while still conforming to the same protocol? As one may know, a condition for directed graphs requires there to be atleast 1 edge.&nbsp;</div><div class=""><br class=""></div><div class="">Advice or alternative workarounds would be nice with respect of what I am trying to do here with Graph Theory.&nbsp;</div><div class=""><br class=""></div><div class="">My last 2 options were to either&nbsp;</div><div class=""><br class=""></div><div class="">1. Create separate protocols for the different types of graphs but there's many types so I would be writing a lot of redundant code.&nbsp;</div><div class=""><br class=""></div><div class="">2. Leaving it how it is. Inserting an enum "TypeOfGraph" for the different types of graphs and then computing its type with the help of the different initializer methods.&nbsp;</div><div class=""><br class=""></div><div class=""></div><div class=""><br class=""></div><div class=""><br class=""></div><div class="">--&nbsp;<br class=""></div><div class=""><div class="gmail_signature"><div dir="ltr" class="">Best Regards,<div class=""><br class=""></div><div class="">Muhammad T. Vali</div></div></div>
</div></div>
_______________________________________________<br class="">swift-users mailing list<br class=""><a href="mailto:swift-users@swift.org" class="">swift-users@swift.org</a><br class="">https://lists.swift.org/mailman/listinfo/swift-users<br class=""></div></blockquote></div><div class=""><br class=""></div><div class=""><br class=""></div>I don’t think that works, but in your case it would not be safe anyway. The (Optional-typed) property “edges” is mutable in the “Graphable” protocol — that means that anybody could take an EZDirectedGraph (where the property is non-optional), cast it to a Graphable, and set its “edges” property to nil. Or some generic code might do that.<div class=""><br class=""></div><div class="">Personally, I would recommend removing the optional. If you’re trying to represent the difference between possibly-empty-edges/not-empty-edges, the optional isn’t actually going to give you that safety. After all, there’s nothing in the type-system which says that EZDirectedGraph’s array is not empty. You would need to document that and add assertions when mutating.</div><div class=""><br class=""></div><div class="">If you really wanted to make it rigorously safe, you could create a NonEmptyArray&lt;T&gt; struct which wraps an Array, intercepts mutation events and enforces that the underlying Array is never totally emptied. Then you would need to replace “edges” in Graphable with an associated type. That level of rigorous safety might not be required or even desired — on the other hand, it might help people to detect common bugs more easily. It all depends on your use-cases and your users.</div><div class=""><br class=""></div><div class="">- Karl</div><div class=""><div class=""><br class=""></div></div></body></html>