

質問のタイトルが正しいかどうか分からないので、もし、問題があれば、ご指摘いただければと思います。

Swiftでアプリの作成を行っていて、METALを利用したパフォーマンスの向上を図りました。  
それ自体は、うまく行っているのですが、一方、METALが使えないデバイスに対する  
対応が困っています。

もともと、METALを使わないものを作成していたので、  
METALが使える場合と、使えない場合で、  
対応を分ければよいと思うのですが、その対応のやり方が分かりません。

例えば、シミュレーター（METAL非対応）で動かそうとすると、

[code]

    import Metal
    
[/code]

のところで、コンパイラーエラーが発生します。  
コンパイラーエラーだからだと思うのですが、実際にインポートを行うファイルが実行  
されるかどうかに関係なく、エラーが発生し止まります。

一方、METAL非対応の実機で動かそうとした場合は、実際にインポートを行うファイルが  
実行されないようにしておけば、エラーは発生しません。

せめて、実機で対応できればと思うので、実機でのMETAL対応を確認して、  
METALフレームワークの読み込み（など）を制御できればよいのではないかと  
想像しているのですが、どのようにすれば、それが可能かが分かりません。

よい方法があれば、お教えいただければと思います。  
よろしくお願いいたします。


CC BY-SA 3.0
2015-03-09T11:52:03.103
7658
2015-03-12T04:03:33.110
6006
question
swift xcode6 framework
Swiftでフレームワークの読み込みを管理したい。


こちらで確認が取れてないので申し訳ないですが、もしかしたら、以下の設定でうまくいくかもしれません。

![フレームワークをOptionalに](https://i.stack.imgur.com/jOeHU.png)

Targetの[General] - [Linked Frameworks and
Libraries]でフレームワークのStatusが変更できますが、これを『Optional』にしておけば、実際にフレームワークが必要になったタイミングで、フレームワークをロードしてくれます。

Linking to a Library or Framework  
<https://developer.apple.com/library/mac/recipes/xcode_help-
project_editor/Articles/AddingaLibrarytoaTarget.html>


CC BY-SA 3.0
2015-03-09T14:17:58.420
7664
2015-03-09T14:27:42.257
2015-03-09T14:27:42.257
7459
7459
7658
answer


ビルドターゲットのアーキテクチャ毎にマクロを利用してコードを分岐する方法が利用できると思います。

[code]

    #if !(arch(i386) || arch(x86_64))
        //code device
        import Metal
    #endif
    
[/code]

実際には`import`だけではなく、APIを利用している部分についてもビルドターゲットがシミュレータの場合はビルドされないようにする必要があるので注意してください。


CC BY-SA 3.0
2015-03-12T04:03:33.110
7819
2015-03-12T04:03:33.110
7949
7658
answer