>> I added a separate section on Ambiguity and what the behavior is. I think 
>> you should be able to resolve ambiguity by casting so I went ahead and put 
>> that in. An example:
>> 
>> //Bar and Foo bridge to SomeObjectiveCType
>> struct Bar<T>: ObjectiveCBridgeable { }
>> struct Foo<T>: ObjectiveCBridgeable { }
>> 
>> class API {
>>     let foo: Foo<Int>
>>     func objCVersionOfAFunction(obj: SomeObjectiveCType) -> 
>> SomeObjectiveCType {
>>         let x = obj as! Bar<Int>
>>         // We've told the compiler which protocol impl to call
>>         return foo as! SomeObjectiveCType
>>     }
>> }
>> 
>> Any problems with this approach? It makes handling the ambiguous or manual 
>> bridging case relatively straightforward, though there may be objections to 
>> using casting this way. [Be careful, I still mourn the loss of @conversion 
>> so I’m biased :)]
> 
> 
> The problem I have with allowing the ambiguity is that you can get weird 
> behavior if Bar and Foo are in different modules: import just Bar’s module, 
> and an Objective-C API mentioning SomeObjectiveCType gets bridged as a Bar. 
> Import just Foo’s module, and an Objective-C API mentioning 
> SomeObjectiveCType gets bridged as a Foo. Import both, and SomeObjectiveCType 
> doesn’t get bridged! Now start splitting class hierarchies among those 
> modules and you get some very inconsistent imports… that’s why I think this 
> needs to be an error.
> 

The rule requiring the Swift and @objc types to be in the same module wouldn’t 
allow the scenario you describe.

I’m fine to say it’s an error as this isn’t a capability I have any use for and 
it definitely could cause confusion. The rule could always be relaxed in the 
future if there’s a convincing case for it. I’ll update the proposal to make it 
an error again.


> 
>> We could just  say that we aren’t going to let people have that level of 
>> granularity. Then just introduce a BuiltInBridgeable protocol that 
>> supersedes ObjectiveCBridgeable. A type adopting both will cause the 
>> compiler to prefer the built-in protocol when generating a bridging header, 
>> but the collection types can ignore that and just use ObjectiveCBridgeable. 
>> Presumably the BuiltInBridgeable protocol would just have an associated type 
>> to indicate that the bits are directly mapped to BuiltIn.Word or whatever.
> 
> Yes, that’s a reasonable approach. I don’t think it’s important for this 
> proposal.

I added some wording about magic built-in types like `Int` and a section at the 
bottom about the overall issue and an overriding protocol, but indicated we 
won’t pursue it at this time.


> 
> Two last comments came up, then I’d like to merge and schedule this:
> 
> (1) isBridgedToObjectiveC should be a computed property, not a function
> 
> (2) Please add something indicating that, while one can “as” cast between a 
> value type and its bridged Objective-C type, there are no implicit 
> conversions. We currently have implicit conversions from String -> NSString, 
> Array<T> -> NSArray, Dictionary<K, V> -> NSDictionary, and Set<T> -> NSSet, 
> but we’re not happy about them and we don’t want to create more implicit 
> conversions [*].
> 

Done!



Russ




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

Reply via email to