<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body dir="auto"><div></div><div><br></div><div><br>Am 31.05.2016 um 21:04 schrieb Erica Sadun via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt;:<br><br></div><blockquote type="cite"><div><meta http-equiv="Content-Type" content="text/html charset=us-ascii"><br class=""><div><blockquote type="cite" class=""><div class="">On May 31, 2016, at 12:35 PM, Matthew Johnson &lt;<a href="mailto:matthew@anandabits.com" class="">matthew@anandabits.com</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="">I think I'm -1 on this. &nbsp;It makes things easier for the implementer of the function and harder for the caller. &nbsp;</div><div class=""><br class=""></div><div class="">It's not clear whether the caller could store an argument to pass in a variable, but if they could they would need to list out all cases in the type of the variable (unless these anonymous enums have structural subtyping). &nbsp;This is fragile. &nbsp;Any time that list changes all variable declarations will have to be updated.</div><div class=""><br class=""></div><div class="">Functions are implemented once and usually called more many times. &nbsp;It's better for callers if you just write it like this:</div><div class=""><br class=""></div><div class="">enum FitOrFill { case fit, fill }</div><div class=""><div dir="ltr" class=""><div class="gmail_quote"><div style="word-wrap: break-word;" class=""><table style="border-spacing: 0px; border-collapse: collapse; color: rgb(51, 51, 51); font-family: Helvetica, arial, nimbussansl, liberationsans, freesans, clean, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 13px;" class=""><tbody class=""><tr class=""><td style="padding: 0px 10px; vertical-align: top; overflow: visible; word-wrap: normal;" class=""><font face="UICTFontTextStyleTallBody" size="3" class=""><span style="background-color: rgba(255, 255, 255, 0);" class="">func scaleAndCropImage(</span></font></td></tr><tr class=""><td style="padding: 0px 10px; width: 50px; min-width: 50px; line-height: 18px; text-align: right; vertical-align: top; border-style: solid; border-color: rgb(238, 238, 238); border-width: 0px 1px 0px 0px;" class=""></td><td style="padding: 0px 10px; vertical-align: top; overflow: visible; word-wrap: normal;" class=""><font face="UICTFontTextStyleTallBody" size="3" class=""><span style="background-color: rgba(255, 255, 255, 0);" class="">    image: UIImage,</span></font></td></tr><tr class=""><td style="padding: 0px 10px; width: 50px; min-width: 50px; line-height: 18px; text-align: right; vertical-align: top; border-style: solid; border-color: rgb(238, 238, 238); border-width: 0px 1px 0px 0px;" class=""></td><td style="padding: 0px 10px; vertical-align: top; overflow: visible; word-wrap: normal;" class=""><font face="UICTFontTextStyleTallBody" size="3" class=""><span style="background-color: rgba(255, 255, 255, 0);" class="">    toSize size: CGSize,</span></font></td></tr><tr class=""><td style="padding: 0px 10px; width: 50px; min-width: 50px; line-height: 18px; text-align: right; vertical-align: top; border-style: solid; border-color: rgb(238, 238, 238); border-width: 0px 1px 0px 0px;" class=""></td><td style="padding: 0px 10px; vertical-align: top; overflow: visible; word-wrap: normal;" class=""><font face="UICTFontTextStyleTallBody" size="3" class=""><span style="background-color: rgba(255, 255, 255, 0);" class="">    <b class="">operation: FitOrFill&nbsp;= .fit</b></span></font></td></tr><tr class=""><td style="padding: 0px 10px; width: 50px; min-width: 50px; line-height: 18px; text-align: right; vertical-align: top; border-style: solid; border-color: rgb(238, 238, 238); border-width: 0px 1px 0px 0px;" class=""></td><td style="padding: 0px 10px; vertical-align: top; overflow: visible; word-wrap: normal;" class=""><font face="UICTFontTextStyleTallBody" size="3" class=""><span style="background-color: rgba(255, 255, 255, 0);" class="">    ) -&gt; UIImage {</span></font></td></tr></tbody></table></div></div></div><br class=""><div class="">So unless these anonymous enums are structurally subtyped I think it's a bad idea. &nbsp;And introducing structural subtyping here seems like a pretty large hammer for this use case.</div></div></div></div></blockquote></div><br class=""><div class=""><br class=""></div><div class="">From the caller's point of view, the type must be inferable and exactly match a token listed in the declaration (which would also appear in Quick Help):</div><div class=""><br class=""></div><div class=""><font face="Menlo" class="">let _ = scaleAndCropImage(image: myImage, toSize: size, operation: .fill)</font></div><div class=""><br class=""></div><div class="">You would not be able to assign `.fill` to a variable and use that for the operation value.</div></div></blockquote><div><br></div>That's a big negative point. This means that a small convenience for the implementor results in heavy restrictions for the caller who cannot structure his algorithm appropriately and will probably have to create (i.e. duplicate) the enum anyway.<div>Thinking of your example: where might the value for .fit or .fill come from? In most cases it won't be hardcoded in the call, but be either the result of a user setting or an algorithm. Both would need to be able to assign this value.</div><div><br></div><div>As a consequence this is just a feature for use in a Playground where it is very convenient, but that means it doesn't pull its own weight, because it degrades the design outside of Playgrounds.</div><div>So a -1 from me.</div><div><br></div><div>-Thorsten&nbsp;<br><div><br></div><div>-Thorsten&nbsp;</div></div></body></html>