Well my idea also included module(X), modelled after the os() function, e.g. 
#if os(OSX)

#if import UIKit
        // Some UIKit-related declarations
#endif
// Later in the same file
func f() {
        #if module(UIKit)
                // Use UIKit-only declarations
        #endif
}


Looking forward to seeing more feedback, esp from Erica. My concern was that 
hasModule() was just a bit raw.

I will point out a few concerns I have:

Is there a better way of writing this with nothing inside:
#if import UIKit
#endif

Is it strange that all other functions with #if use parentheses (), but not 
import?

However, I just feel code like this doesn’t feel very Swifty:

#if hasModule(UIKit)
        import UIKit
#endif

> However, I don't get your concerns of "whether already imported or not". 
> Isn't `import` strictly about bringing identifiers of linked libraries 
> visible in the current file and not about linking to libraries in code.


I was originally going to include this, but cut it out, because it would be an 
unclear way to still import something. import ‘returned’ a boolean. So forgot 
to cut that bit out too.

#if ! import SomethingCool
        import SomeFallback
#endif

> On 13 May 2016, at 6:54 PM, Gwendal Roué <gwendal.r...@gmail.com> wrote:
> 
> Hello,
> 
> `#if import Foo` can not deal with the fact that a single source file may 
> have to perform the importability test several times.
> 
> For example:
> 
>       #if canImport(UIKit)
>               import UIKit
>               // Some UIKit-related declarations
>       #endif
>       // Later in the same file
>       func f() {
>               #if canImport(UIKit)
>                       // Use UIKit-only declarations
>               #endif
>       }
> 
> I know, I know, some will tell me to refactor my code. So let's just say I'm 
> prototyping and that the code doesn't have its final shape, OK?
> 
> Still, testing for module importability is not the same as importing it.
> 
> Gwendal Roué
> 
>> Le 13 mai 2016 à 10:40, Pyry Jahkola via swift-evolution 
>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> a écrit :
>> 
>> Patrick,
>> 
>> I think you're making valuable points here. I also can't think of cases 
>> where you wouldn't also import a module in case it was found to be 
>> importable. So the use cases I can think of could as well be tackled by 
>> allowing expressions such as `import Foo.Bar` as compile-time checks within 
>> the conditions of `#if` like you suggested. That would bring those libraries 
>> only visible within the scope of that block.
>> 
>> However, there can be cases where you're considering importing more than one 
>> module, so something like:
>> 
>>     #if import Foo, import Bar
>>       ...
>>     #elseif import Baz
>>       ...
>>     #endif
>> 
>> should be considered in that design too. And I don't like the fact that it 
>> would import many modules in one line of code.
>> 
>> However, I don't get your concerns of "whether already imported or not". 
>> Isn't `import` strictly about bringing identifiers of linked libraries 
>> visible in the current file and not about linking to libraries in code.
>> 
>> — Pyry
>> 
>>> I guess one issue I can see is it’s used in two different ways:
>>> - The first use of canImport is used to check whether it can import a 
>>> module, and then does so, but there’s no requirement for it to do so. Is 
>>> this the right this to do?
>>> - The second use of canImport makes no guarantee that the module has been 
>>> imported, only that it can.
>>> 
>>> What if instead `import` could return whether it imported or not, when used 
>>> with #if? Instead of ‘can import’, you get ‘did just import’ and ‘has 
>>> imported’.
>>> 
>>> 
>>> import Required // Error if not present, current behaviour
>>> 
>>> #if import CoolThing // Skips code block if not present, imports otherwise
>>>  // Do something with CoolThing module
>>> #else
>>>  import AlmostAsCoolThing
>>> #endif
>>> 
>>> and you test at the use-site
>>> 
>>> #if module(X) // Does not import, only checks if it has been imported
>>>  // use things that are available in X
>>> #else
>>> 
>>> 
>>> As per Pyry’s feedback, you could add a version:
>>> 
>>> #if import Frobnication(<1.7.3) // <- Only added version constraint here.
>>> extension Knob : Frobnicatable { ... }
>>> #endif
>>> 
>>> 
>>> 
>>> Just a way to make it less low level.
>>> 
>>> _______________________________________________
>>> 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 <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