[swift-evolution] Type-safe selectors

Joe Groff jgroff at apple.com
Sat Dec 5 20:00:36 CST 2015


> On Dec 5, 2015, at 12:35 PM, Kevin Ballard <kevin at sb.org> wrote:
> 
> On Sat, Dec 5, 2015, at 04:30 AM, Michel Fortin wrote:
>> Like this:
>> 
>> 	view.action = "_doSomething_UniqueSelector1234_currentModuleName_blahblah"
>> 
>> 	extension NSObject {
>> 		func _doSomething_UniqueSelector1234_currentModuleName_blahblah() {
>> 			let target = self
>> 			(target as! MyObject).doSomething()
>> 		}
>> 	}
>> 
>> (Joe Groff suggested it first.) This simply assumes the receiver will
>> derive from NSObject. You also need to set a non-nil target. And note
>> that the closure is context-free, meaning you can't capture variables
>> with it.
> 
> How is this type-safe? You're using as! in there (and silently ignoring
> the message if the receiver is wrong wouldn't be any better). If I send
> a selector to the wrong receiver, it's still going to crash.

I think this would be better emitted like a category on MyObject than on NSObject.

> This comes back to my fundamental argument, which is that
> @convention(selector) looks like it's type-safe, but there's so many
> holes and so many implicit coercions that need to be added that you can
> drive a gigantic truck full of unsafety right through it without even
> noticing.

There's plenty of useful space between "no type safety" and "perfect type safety", IMO.

-Joe


More information about the swift-evolution mailing list