<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body dir="auto"><div>Hi Rob,</div><div id="AppleMailSignature"><br></div><div id="AppleMailSignature">I think we could actually do that (and cause the same bug) with the derived classes Anton mentioned, which means the behaviour is inconsistent, despite the perhaps safety.</div><div id="AppleMailSignature"><br></div><div id="AppleMailSignature">- Rod</div><div><br>On 11 Mar 2017, at 6:32 am, Rob Mayoff &lt;<a href="mailto:mayoff@dqd.com">mayoff@dqd.com</a>&gt; wrote:<br><br></div><blockquote type="cite"><div><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Fri, Mar 10, 2017 at 6:08 AM, Rod Brown 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:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hi everyone. I found something odd that seems baked into how Cocoa Touch does protocols, but Swift cannot model it:<br>
<br>
<br>
@interface UIScrollView: UIView<br>
<br>
@property (weak, nonatomic) id &lt;UIScrollViewDelegate&gt; delegate;<br>
<br>
@end<br>
<br>
@interface UITableView: UIScrollView<br>
<br>
@property (weak, nonatomic) id &lt;UITableViewDelegate&gt; delegate;<br>
<br>
@end<br>
<br>
@protocol UITableViewDelegate: UIScrollViewDelegate<br>
...<br>
@end<br></blockquote><div><br></div><div>The problem here is that `UITableView`'s redefinition of `delegate` is not type-safe. By casting a `UITableView` reference to a `UIScrollView`, you set the `delegate` to something that doesn't conform to `UITableView`:</div><div><br></div><div><div>&nbsp; &nbsp; @interface ViewController () &lt;UIScrollViewDelegate&gt;</div><div>&nbsp; &nbsp; @end</div><div><br></div><div>&nbsp; &nbsp; @implementation ViewController</div><div><br></div><div>&nbsp; &nbsp; - (void)viewDidLoad {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; [super viewDidLoad];</div><div><br></div><div>&nbsp; &nbsp; &nbsp; &nbsp; UITableView *tableView = [[UITableView alloc] init];</div><div><br></div><div>&nbsp; &nbsp; &nbsp; &nbsp; // This line correctly generates a warning, because self isn't a UITableViewDelegate:</div><div>&nbsp; &nbsp; &nbsp; &nbsp; tableView.delegate = self;</div><div><br></div><div>&nbsp; &nbsp; &nbsp; &nbsp; // This line generates no warning:</div><div>&nbsp; &nbsp; &nbsp; &nbsp; ((UIScrollView *)tableView).delegate = self;</div><div>&nbsp; &nbsp; }</div><div><br></div><div>&nbsp; &nbsp; @end</div></div><div><br></div></div></div></div>
</div></blockquote></body></html>