<html><body><div>Maybe I shouldn't have mentioned anything about the runtime since that's more about the implementation instead of the general idea... Something more "swifty" could be a compile check&nbsp;on the newly strengthened arguments.<br></div><div><br data-mce-bogus="1"></div><div>If I understand your example code, it's calling didPerformSomeAction(object: Bar) instead of the Foo version because&nbsp;of function overloading? It seems&nbsp;this functionally satisfies not having to typecast, but it doesn't solve the verbosity problem since&nbsp;you're still forced to implement the extraneous didPerformSomeAction(object: Foo).</div><div><br data-mce-bogus="1"></div><div>Using the&nbsp;Cocoa framework as an example, NSOutlineViewDelegate has the method:<span class="n" style="background-color: transparent; border: 0px; font-size: 12px; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline; color: #5c2699; font-family: Menlo, monospace;" data-mce-style="background-color: transparent; border: 0px; font-size: 12px; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline; color: #5c2699; font-family: Menlo, monospace;"></span></div><div><span class="kt" style="background-color: transparent; border: 0px; font-size: 12px; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline; color: #aa3391; font-family: Menlo, monospace;" data-mce-style="background-color: transparent; border: 0px; font-size: 12px; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline; color: #aa3391; font-family: Menlo, monospace;">optional</span><span style="font-family: Menlo, monospace; font-size: 12px; background-color: #f9f9f9;" data-mce-style="font-family: Menlo, monospace; font-size: 12px; background-color: #f9f9f9;">&nbsp;</span><span class="kt" style="background-color: transparent; border: 0px; font-size: 12px; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline; color: #aa3391; font-family: Menlo, monospace;" data-mce-style="background-color: transparent; border: 0px; font-size: 12px; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline; color: #aa3391; font-family: Menlo, monospace;">func</span><span style="font-family: Menlo, monospace; font-size: 12px; background-color: #f9f9f9;" data-mce-style="font-family: Menlo, monospace; font-size: 12px; background-color: #f9f9f9;">&nbsp;</span><span class="nl" style="background-color: transparent; border: 0px; font-size: 12px; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline; font-family: Menlo, monospace;" data-mce-style="background-color: transparent; border: 0px; font-size: 12px; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline; font-family: Menlo, monospace;">outlineView</span><span style="font-family: Menlo, monospace; font-size: 12px; background-color: #f9f9f9;" data-mce-style="font-family: Menlo, monospace; font-size: 12px; background-color: #f9f9f9;">(</span><span class="nl" style="background-color: transparent; border: 0px; font-size: 12px; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline; font-family: Menlo, monospace;" data-mce-style="background-color: transparent; border: 0px; font-size: 12px; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline; font-family: Menlo, monospace;">_</span><span style="font-family: Menlo, monospace; font-size: 12px; background-color: #f9f9f9;" data-mce-style="font-family: Menlo, monospace; font-size: 12px; background-color: #f9f9f9;">&nbsp;</span><code class="code-voice" style="background-color: transparent; border: 0px; font-size: 0.85em; margin: 0px 0px 15px; outline: 0px; padding: 0px 0px 6px; vertical-align: baseline; font-family: Menlo, monospace; word-wrap: break-word;" data-mce-style="background-color: transparent; border: 0px; font-size: 0.85em; margin: 0px 0px 15px; outline: 0px; padding: 0px 0px 6px; vertical-align: baseline; font-family: Menlo, monospace; word-wrap: break-word;"><em class="parameter-name" style="background-color: transparent; border: 0px; font-size: 12px; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline; color: #414141; line-height: 1.5;" data-mce-style="background-color: transparent; border: 0px; font-size: 12px; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline; color: #414141; line-height: 1.5;">outlineView</em></code><span style="font-family: Menlo, monospace; font-size: 12px; background-color: #f9f9f9;" data-mce-style="font-family: Menlo, monospace; font-size: 12px; background-color: #f9f9f9;">:&nbsp;</span><span class="n" style="background-color: transparent; border: 0px; font-size: 12px; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline; color: #5c2699; font-family: Menlo, monospace;" data-mce-style="background-color: transparent; border: 0px; font-size: 12px; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline; color: #5c2699; font-family: Menlo, monospace;"><a href="https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSOutlineView_Class/index.html#//apple_ref/swift/cl/c:objc(cs)NSOutlineView" data-renderer-version="2" style="background-color: transparent; border: 0px; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline; color: inherit; text-decoration: none;" data-mce-href="https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSOutlineView_Class/index.html#//apple_ref/swift/cl/c:objc(cs)NSOutlineView" data-mce-style="background-color: transparent; border: 0px; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline; color: inherit; text-decoration: none;">NSOutlineView</a></span><span style="font-family: Menlo, monospace; font-size: 12px; background-color: #f9f9f9;" data-mce-style="font-family: Menlo, monospace; font-size: 12px; background-color: #f9f9f9;">,</span><br style="font-family: Menlo, monospace; font-size: 12px;" data-mce-style="font-family: Menlo, monospace; font-size: 12px;"><span style="font-family: Menlo, monospace; font-size: 12px; background-color: #f9f9f9;" data-mce-style="font-family: Menlo, monospace; font-size: 12px; background-color: #f9f9f9;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="nl" style="background-color: transparent; border: 0px; font-size: 12px; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline; font-family: Menlo, monospace;" data-mce-style="background-color: transparent; border: 0px; font-size: 12px; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline; font-family: Menlo, monospace;">shouldSelectItem</span><span style="font-family: Menlo, monospace; font-size: 12px; background-color: #f9f9f9;" data-mce-style="font-family: Menlo, monospace; font-size: 12px; background-color: #f9f9f9;">&nbsp;</span><code class="code-voice" style="background-color: transparent; border: 0px; font-size: 0.85em; margin: 0px 0px 15px; outline: 0px; padding: 0px 0px 6px; vertical-align: baseline; font-family: Menlo, monospace; word-wrap: break-word;" data-mce-style="background-color: transparent; border: 0px; font-size: 0.85em; margin: 0px 0px 15px; outline: 0px; padding: 0px 0px 6px; vertical-align: baseline; font-family: Menlo, monospace; word-wrap: break-word;"><em class="parameter-name" style="background-color: transparent; border: 0px; font-size: 12px; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline; color: #414141; line-height: 1.5;" data-mce-style="background-color: transparent; border: 0px; font-size: 12px; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline; color: #414141; line-height: 1.5;">item</em></code><span style="font-family: Menlo, monospace; font-size: 12px; background-color: #f9f9f9;" data-mce-style="font-family: Menlo, monospace; font-size: 12px; background-color: #f9f9f9;">:&nbsp;</span><span class="n" style="background-color: transparent; border: 0px; font-size: 12px; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline; color: #5c2699; font-family: Menlo, monospace;" data-mce-style="background-color: transparent; border: 0px; font-size: 12px; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline; color: #5c2699; font-family: Menlo, monospace;"><a href="https://developer.apple.com/library/mac/documentation/Swift/Reference/Swift_AnyObject_Protocol/index.html#//apple_ref/swift/intf/s:PSs9AnyObject" data-renderer-version="2" style="background-color: transparent; border: 0px; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline; color: inherit; text-decoration: none;" data-mce-href="https://developer.apple.com/library/mac/documentation/Swift/Reference/Swift_AnyObject_Protocol/index.html#//apple_ref/swift/intf/s:PSs9AnyObject" data-mce-style="background-color: transparent; border: 0px; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline; color: inherit; text-decoration: none;">AnyObject</a></span><span style="font-family: Menlo, monospace; font-size: 12px; background-color: #f9f9f9;" data-mce-style="font-family: Menlo, monospace; font-size: 12px; background-color: #f9f9f9;">) -&gt;&nbsp;</span><span class="n" style="background-color: transparent; border: 0px; font-size: 12px; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline; color: #5c2699; font-family: Menlo, monospace;" data-mce-style="background-color: transparent; border: 0px; font-size: 12px; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline; color: #5c2699; font-family: Menlo, monospace;"><a href="https://developer.apple.com/library/mac/documentation/Swift/Reference/Swift_Bool_Structure/index.html#//apple_ref/swift/struct/s:Sb" data-renderer-version="2" style="background-color: transparent; border: 0px; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline; color: inherit; text-decoration: none;" data-mce-href="https://developer.apple.com/library/mac/documentation/Swift/Reference/Swift_Bool_Structure/index.html#//apple_ref/swift/struct/s:Sb" data-mce-style="background-color: transparent; border: 0px; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline; color: inherit; text-decoration: none;">Bool</a></span></div><div><br data-mce-bogus="1"></div><div>If my NSOutlineView contained objects of a single type, it makes little sense to be forced to implement a method solely for&nbsp;handling AnyObjects or being forced to typecast to my model type.</div><div><br data-mce-bogus="1"></div><div>It seems more expressive and more functionally correct to be able to&nbsp;implement a method&nbsp;strengthening AnyObject to my model type while still conforming to the protocol (since my model would&nbsp;pass "is AnyObject").</div><div><br>On Dec 16, 2015, at 12:35 PM, Ian Ynda-Hummel &lt;ianynda@gmail.com&gt; wrote:<br><br></div><div><blockquote type="cite"><div class="msg-quote"><div dir="ltr">Sorry, that should be<div><br></div><div><div>&nbsp; &nbsp; extension FooDelegate where Self: BarController {<br></div><div><div>&nbsp; &nbsp; &nbsp; &nbsp; func didPerformSomeAction(object: Bar) {}</div><div>&nbsp; &nbsp; }</div></div></div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr">On Wed, Dec 16, 2015 at 3:32 PM Ian Ynda-Hummel &lt;<a href="mailto:ianynda@gmail.com" data-mce-href="mailto:ianynda@gmail.com">ianynda@gmail.com</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin: 0 0 0 0.8ex; border-left: 1px #ccc solid; padding-left: 1ex;" data-mce-style="margin: 0 0 0 0.8ex; border-left: 1px #ccc solid; padding-left: 1ex;"><div dir="ltr">-1<div><br></div><div>I think the basic problem is saying the runtime should fail. I feel like a large part of the power of Swift is letting the compiler and the programmer make strong assumptions about types specifically to prevent the runtime from dealing with it.</div><div><br></div><div>In fact, the type system can save us here! I wrote some code you can play with here:&nbsp;<a href="http://swiftstub.com/318278733" data-mce-href="http://swiftstub.com/318278733">http://swiftstub.com/318278733</a></div><div><br></div><div>The basic idea is that if you do something like</div><div><br></div><div>&nbsp; &nbsp; extension FooDelegate where Self: BarController {<br></div><div><div>&nbsp; &nbsp; &nbsp; &nbsp; func didPerformSomeAction(object: Foo) {}</div><div>&nbsp; &nbsp; }</div></div><div><br></div><div>calls to didPerformSomeAction with an argument of type Bar will call the right one for the type! There might be better ways to do that, but that is what immediately came to mind.</div></div><div dir="ltr"><div><br></div><div dir="ltr"><div><div class="gmail_quote"><div dir="ltr">On Wed, Dec 16, 2015 at 2:43 PM Terrence Katzenbaer via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" data-mce-href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin: 0 0 0 0.8ex; border-left: 1px #ccc solid; padding-left: 1ex;" data-mce-style="margin: 0 0 0 0.8ex; border-left: 1px #ccc solid; padding-left: 1ex;"><div><div>Because APIs are designed to be generic, protocols that must be conformed generally use types like Object or other base classes for a given framework. This introduces type casting&nbsp;verbosity when implementing the protocol for a specific use. I would like to see the ability to&nbsp;strengthen argument types in&nbsp;functions declared for protocol conformance.</div><div><br></div><div>An example:</div><div><p style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'menlo';" data-mce-style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'menlo';"><span style="color: #0433ff;" data-mce-style="color: #0433ff;">class</span> Foo { }</p><p style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'menlo'; min-height: 13px;" data-mce-style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'menlo'; min-height: 13px;"><br></p><p style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'menlo';" data-mce-style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'menlo';"><span style="color: #0433ff;" data-mce-style="color: #0433ff;">class</span> Bar: <span style="color: #3495af;" data-mce-style="color: #3495af;">Foo</span> { }</p><p style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'menlo'; min-height: 13px;" data-mce-style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'menlo'; min-height: 13px;"><br></p><p style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'menlo';" data-mce-style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'menlo';"><span style="color: #0433ff;" data-mce-style="color: #0433ff;">protocol</span> FooDelegate {</p><p style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'menlo';" data-mce-style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'menlo';">&nbsp; &nbsp; <span style="color: #0433ff;" data-mce-style="color: #0433ff;">func</span> didPerformSomeAction(object: <span style="color: #3495af;" data-mce-style="color: #3495af;">Foo</span>)</p><p style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'menlo';" data-mce-style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'menlo';">}</p><p style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'menlo'; min-height: 13px;" data-mce-style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'menlo'; min-height: 13px;"><br></p><p style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'menlo';" data-mce-style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'menlo';"><span style="color: #0433ff;" data-mce-style="color: #0433ff;">class</span> FooController: <span style="color: #3495af;" data-mce-style="color: #3495af;">FooDelegate</span> {</p><p style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'menlo';" data-mce-style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'menlo';">&nbsp; &nbsp; <span style="color: #0433ff;" data-mce-style="color: #0433ff;">func</span> didPerformSomeAction(<span style="color: #0433ff;" data-mce-style="color: #0433ff;">var</span> object: <span style="color: #3495af;" data-mce-style="color: #3495af;">Foo</span>) {</p><p style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'menlo'; color: #008f00;" data-mce-style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'menlo'; color: #008f00;"><span style="color: #000000;" data-mce-style="color: #000000;">&nbsp; &nbsp; &nbsp; &nbsp; </span>// I know that object must be a Bar instance</p><p style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'menlo';" data-mce-style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'menlo';">&nbsp; &nbsp; &nbsp; &nbsp; object = object <span style="color: #0433ff;" data-mce-style="color: #0433ff;">as</span>! <span style="color: #3495af;" data-mce-style="color: #3495af;">Bar</span></p><p style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'menlo'; color: #008f00;" data-mce-style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'menlo'; color: #008f00;"><span style="color: #000000;" data-mce-style="color: #000000;">&nbsp; &nbsp; &nbsp; &nbsp; </span>// do something with object</p><p style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'menlo';" data-mce-style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'menlo';">&nbsp; &nbsp; }</p><p style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'menlo';" data-mce-style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'menlo';">}</p><p style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'menlo'; min-height: 13px;" data-mce-style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'menlo'; min-height: 13px;"><br></p><p style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'menlo'; color: #008f00;" data-mce-style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'menlo'; color: #008f00;"><span style="color: #0433ff;" data-mce-style="color: #0433ff;">class</span><span style="color: #000000;" data-mce-style="color: #000000;"> ProposedFooController: </span><span style="color: #3495af;" data-mce-style="color: #3495af;">FooDelegate</span><span style="color: #000000;" data-mce-style="color: #000000;"> { </span>// Type 'ProposedFooController' does not conform to protocol 'FooDelegate'</p><p style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'menlo';" data-mce-style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'menlo';">&nbsp; &nbsp; <span style="color: #0433ff;" data-mce-style="color: #0433ff;">func</span> didPerformSomeAction(object: <span style="color: #3495af;" data-mce-style="color: #3495af;">Bar</span>) {</p><p style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'menlo'; color: #008f00;" data-mce-style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'menlo'; color: #008f00;"><span style="color: #000000;" data-mce-style="color: #000000;">&nbsp; &nbsp; &nbsp; &nbsp; </span>// do something with Bar instance</p><p style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'menlo';" data-mce-style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'menlo';">&nbsp; &nbsp; }</p><p style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'menlo';" data-mce-style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'menlo';">}</p></div><div><br></div><div>The glaring issue I see outright is&nbsp;how the runtime should fail when `didPerformSomeAction` in `ProposedFooController` is called with a non-Bar instance... But perhaps it /should/ fail outright because&nbsp;the programmer has explicitly stated that the type should be Bar.</div><div><br></div><div><p style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'menlo'; color: #eee8e4;" data-mce-style="margin: 0px; font-size: 11px; line-height: normal; font-family: 'menlo'; color: #eee8e4;"><br></p><br></div><img src="https://u2002410.ct.sendgrid.net/wf/open?upn=t5fkNsX-2F7-2FAygTFNPNE08PALgkjkO6I8wpsdssDS0ugoflEETQHfxbRSSUNh46A-2BBnty0AXF7-2F6V5IQrrWPPBPAAl2lhLAQfBmDE5XvduAb6E464TtuafU3IXuGYZPz4mvZzryd8ZWjagjCwHhDshUoA4qyLHUW5EmcqV4f7vbArb-2FwoFZqUuYa9zXycao6i5RWqdYAQSDNHXQd4qkIKr7cbGbIUUbSKIQr58UPkaXc-3D" alt="" width="1" height="1" border="0" style="min-height: 1px; width: 1px; border-width: 0; padding: 0; margin: 0;" data-mce-src="https://u2002410.ct.sendgrid.net/wf/open?upn=t5fkNsX-2F7-2FAygTFNPNE08PALgkjkO6I8wpsdssDS0ugoflEETQHfxbRSSUNh46A-2BBnty0AXF7-2F6V5IQrrWPPBPAAl2lhLAQfBmDE5XvduAb6E464TtuafU3IXuGYZPz4mvZzryd8ZWjagjCwHhDshUoA4qyLHUW5EmcqV4f7vbArb-2FwoFZqUuYa9zXycao6i5RWqdYAQSDNHXQd4qkIKr7cbGbIUUbSKIQr58UPkaXc-3D" data-mce-style="min-height: 1px; width: 1px; border-width: 0; padding: 0; margin: 0;"></div>_______________________________________________<br> swift-evolution mailing list<br> <a href="mailto:swift-evolution@swift.org" data-mce-href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br> <a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" data-mce-href="https://lists.swift.org/mailman/listinfo/swift-evolution">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br></blockquote></div></div></div></div></blockquote></div></div></blockquote></div></body></html>