> On Jan 4, 2017, at 8:59 PM, Timothy Wood <[email protected]> wrote:
> 
> 
> 
> 
>> On Jan 4, 2017, at 4:50 PM, Douglas Gregor via swift-evolution 
>> <[email protected] <mailto:[email protected]>> wrote:
> 
> 
> 
>> A Swift 3-to-4 migrator is the hardest part of the story. Ideally, the 
>> migrator to only add @objc in places where it is needed, so that we see some 
>> of the expected benefits of code-size reduction. However, there are two 
>> problems with doing so:
>> 
>> Some of the uses that imply the need to add @objc come from Objective-C 
>> code, so a Swift 3-to-4 migrator would also need to compile the Objective-C 
>> code (possibly with a modified version of the Objective-C compiler) and 
>> match up the "deprecated" warnings mentioned in the Swift 3 compatibility 
>> mode bullet with Swift declarations.
>> 
>> The migrator can't reason about dynamically-constructed selectors or the 
>> behavior of other tools that might directly use the Objective-C runtime, so 
>> failing to add a @objc will lead to migrated programs that compile but fail 
>> to execute correctly.
>> 
> This seems fairly worrisome, but I’m sure how much so. I personally would 
> probably prefer a guaranteed non-breaking migrator (since Swift 4 isn’t 
> supposed to break stuff…) that adds the @objc where it was previously 
> inferred. Sure, this won’t make existing code smaller/faster, but more 
> importantly it won’t break it. The developer than then opt to remove the 
> unneeded annotations over time (allowing for incremental testing and later 
> bisection if a problem crops up).

It’s the conservative thing for the migrator to do, although it’ll potentially 
make a mess of migrated source code by littering it with 
potentially-unnecessary @objc’s.

>> Proposal add-on: @objc annotations on class definitions and extensions
>> 
>> If the annotation burden of @objc introduced by this proposal is too high, 
>> we could make @objc on a class definition or extension thereof imply @objc 
>> on those members that can be exposed to Objective-C. For example:
>> 
>> @objc extension MyClass {
>>   // implicitly @objc
>>   func f() { }
>> 
>>   // Cannot be exposed to Objective-C because tuples aren't representable in 
>> Objective-C
>>   func g() -> (Int, Int) { return (1, 2) }
>> }
> This seems like it goes counter to cleaning up the confusion by 
> re-introducting silent non-exposure due to use of Swift-only types. It also 
> seems odd that @objc would cascade to members when `public` and other access 
> levels don’t (though it could do the same inference based on the access level 
> of the types involved.

Yeah, I tend to agree with you that this add-on is likely not worth doing. I 
put it into the draft this way to provoke discussion, because this has come up 
before.

        - Doug


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

Reply via email to