and as you would expect … 

T4 =======
import Lib1                     // importing EVERYTHING from lib1
import func Lib2.func2          // importing ONLY func2 from lib2

var int1 = func1()              // 1 , because lib2::func2 is not ‘visible'

 —> showing again how extensions are treated differently


Lib1 ===========
public func func1() -> Int {
  return 1
}

Lib2 ===========
public func func1() -> Int {
  return 2
}


from what I saw and read, this is a rather fundamental behavior that may not be 
easily negotiated.




> On Jun 7, 2016, at 8:11 PM, L Mihalkovic <laurent.mihalko...@gmail.com> wrote:
> 
> T1 =======
> import Lib1
> var str = func2()     // lib1
> 
> T2 =======
> import Lib1
> import func Lib2.func2
> var str = func2()     // lib2
> 
> T3 =======
> import Lib1
> import func Lib2.func2
> var str = “str”.allCaps()     // ERROR : ambiguous name
> 
> 
> Lib1 ===========
> public func func2() -> String {
>   return "lib1"
> }
> // only during T3
> public extension String {
>   public func allCaps() -> String {
>     return “lib1_"
>   }
> }
> 
> Lib2 ===========
> public func func2() -> String {
>   return "lib2"
> }
> // only during T3
> public extension String {
>   public func allCaps() -> String {
>     return "lib2_"
>   }
> }
> 
> 
> T3 shows how differently extensions are treated from all other 
> exportable/importable artifacts:  extensions are NOT sensitive to the scope 
> of imports. they are fully loaded as soon as the loader detects that the 
> module is referenced (they come from their own table inside the module 
> binary).
> 
> 
> 
> 
>> On Jun 7, 2016, at 6:45 PM, Paul Cantrell <cantr...@pobox.com 
>> <mailto:cantr...@pobox.com>> wrote:
>> 
>>> 
>>> On Jun 7, 2016, at 11:36 AM, Paul Cantrell via swift-evolution 
>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>>> 
>>>> 
>>>> On Jun 7, 2016, at 10:47 AM, L. Mihalkovic via swift-evolution 
>>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>>>> 
>>>> On Jun 7, 2016, at 4:53 PM, Tony Allevato <allev...@google.com 
>>>> <mailto:allev...@google.com>> wrote:
>>>> 
>>>>> I like the "from" keyword the best, but I'll take my own stab at a 
>>>>> modification:
>>>>> 
>>>>>     import ModuleA
>>>>>     import ModuleB
>>>>> 
>>>>>     "hello world".(capitalized from ModuleA)()
>>>>>     "hello world".(capitalized from ModuleB)()
>>>>>     "hello world".(someProperty from ModuleA)
>>>>>     "hello world".(someProperty from ModuleB)
>>>> 
>>>> Hmmm... looks like an oxymoron in its own right... I was under the 
>>>> impression so far that the point of extensions was that they are not tied 
>>>> to a source. This brings us back full circle to the very definition of 
>>>> extensions... However you slice it, swift is lacking some scoping bellow 
>>>> modules, and/or arround some of the language features.
>>> 
>>> IIRC, a member of the core team (Joe Groff, maybe?) indicated several 
>>> months ago on the list that methods are internally namespaced to their 
>>> module. Alas, I can’t find that message. It was a long time ago.
>> 
>> Ah, here it is: 
>> https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20151207/000928.html
>>  
>> <https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20151207/000928.html>
>> 
>> Joe Groff wrote:
>> 
>> “It's helpful to think of method names as being namespaced in Swift, by both 
>> their enclosing module and type. If two modules independently extend a 
>> protocol with a method of the same name, you still semantically have two 
>> distinct methods that dispatch independently. The extension would have to be 
>> factored into a common module both modules see for them to interact.”
>> 
>> IOW, yes, Swift internally does something very much like "hello 
>> world”.ModuleA::capitalized().
>> 
>>> You can see this in the fact that two different files can see two different 
>>> extension methods:
>>> 
>>> A.swift
>>> 
>>>     import ModuleA
>>>     …
>>>     "hello world".capitalized()
>>> 
>>> B.swift
>>> 
>>>     import ModuleB
>>>     …
>>>     "hello world".capitalized()
>>> 
>>> …even if they end up compiled into the same binary. And that makes sense: 
>>> A.swift only expected to see ModuleA’s extension, and was presumably coded 
>>> around that expectation. That ModuleB happened to end up mixed into the 
>>> same binary shouldn’t change the behavior of A.swift
>>> 
>>> If my understand is correct, then my "hello world”.ModuleA::capitalized() 
>>> and your "hello world".(capitalized from ModuleA)() are both just syntax to 
>>> expose something that Swift already tracks internally.
>>> 
>>> Cheers, P
>>> 
>>> _______________________________________________
>>> swift-evolution mailing list
>>> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
>>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>

_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to