[swift-evolution] [discussion] Change the behavior of @objc on a class?
Jordan Rose
jordan_rose at apple.com
Tue Jun 28 15:47:47 CDT 2016
Xcode plans are a little beyond the scope of the Swift project, so I can't promise that there would be any such autoupdating. If there were such a feature, I'd expect it to be in the form of a one-time migration, probably triggered along with the Swift 3 migrator…but the IB team might have other ideas, or decide they have more important things to finish for this release. So I guess the answer is "don't count on it".
Jordan
> On Jun 27, 2016, at 21:56, Charlie Monroe <charlie at charliemonroe.net> wrote:
>
> Do you know how would this affect e.g. XIB files or CoreData models where you have the class name + module? If the class was previously marked @objc and now it would be implicitely @objc(ClassName), would it require all XIB files to be updated, or would the XIB compiler be able to deal with it? If the former, than it's a big no for me.
>
> I'm not a big fan of a change on any account either, though, since it's absolutely not clear that @objc would have this side-effect.
>
>> On Jun 27, 2016, at 10:26 PM, Jordan Rose via swift-evolution <swift-evolution at swift.org <mailto:swift-evolution at swift.org>> 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).
>>
>> 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.
>>
>> 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.
>> - 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
>>
>> P.S. This is rdar://problem/22296436 <rdar://problem/22296436> for anyone else at Apple.
>> _______________________________________________
>> swift-evolution mailing list
>> swift-evolution at swift.org <mailto:swift-evolution at swift.org>
>> https://lists.swift.org/mailman/listinfo/swift-evolution
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160628/dd70d59c/attachment.html>
More information about the swift-evolution
mailing list