> On Jun 27, 2016, at 1:26 PM, Jordan Rose via swift-evolution 
> <[email protected]> wrote:
> 
> Hey, all. An engineer at Apple noticed the following behavior:
> 
> 1. class Foo: NSObject → exposed to Objective-C, Swift-style (mangled) 
> runtime name
> 2. @objc class Foo: NSObject → exposed to Objective-C, Swift-style (mangled) 
> runtime name
> 3. @objc(Foo) class Foo: NSObject → exposed to Objective-C, unmangled runtime 
> name
> 
> (and 4. @objc class Foo → illegal, classes must have ObjC heritage to be 
> @objc.)
> 
> They specifically observed that (1) and (2) have the same behavior, and 
> suggested that maybe (2) should be shorthand for (3).

I actually wonder why NSObject subclasses magically appear in the generated 
header when they aren’t marked @objc. If anything I’d say we should remove that 
behavior.


> 
> Pros:
> - There aren't two ways to spell (1).
> - Removing the mangling (and module uniquing) from the runtime name is 
> probably one of the most common uses of @objc on a class.

Another really common case (at least in our mixed codebase) is bridging to give 
the class a “private” name in Swift but a sensible name in Objective-C because 
we have a sensible struct or generic type in Swift, don’t want Swift consumers 
to use the @objc type, yet need to provide a bridged interface to Objective-C. 
We do the same with methods too.

@objc(Tile)
public class _objc_Tile: NSObject { }



> 
> Cons:
> - It's a source-breaking change, for all that the "@objc" in (2) is redundant.
> - For protocols, (1) and (2) are not equivalent, because @objc isn't 
> inherited there.

I’d favor consistency even if (1) and (2) are redundant.

> - Mangling is used to namespace class names at run time; if you drop that, 
> the ObjC name should probably have a prefix. (This applies more to frameworks 
> than apps, though.)
> 
> There are probably people who say that last con applies to the generated 
> header as well: we shouldn't put (1) or (2) into the generated header because 
> the ObjC name might conflict with another class at compile time. This is 
> valid, but probably too drastic a change at this point.
> 
> So, what does everyone think? I'm leaning towards "no change" because it's a 
> bit subtle and not a big enough win, but if there's widespread support for 
> this I'll pull it into a proposal.
> 
> Jordan

Given other priorities I’d lean toward no change.

Russ

_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to