2017-09-24 12 views
10

現在のデバイスのiOSバージョンが特定のバージョン(here)以下の場合にのみコードを実行したいと思います。 Appleが与えられたコード例は次のようになります。Objective-Cの@availableキーワードの否定

if (@available(iOS 10.0, *)) { 
    // iOS 10.0 and above 
} else { 
    // below 10.0 
} 

はしかし、1は現在のiOSのバージョンが特定のバージョンを下回っている場合にのみ、コードを実行したいシナリオがあります。これが動作しないようですが

if ([email protected](iOS 10.0, *)) { 
    // below 10.0 
} 

、と私はXcodeのから次の警告取得しています:私は、次のコードが動作すると仮定

@available does not guard availability here; use if (@available) instead 

HereをLLVMを追加したことをコミットしています私は診断しています。

  1. ifブロック(非常にエレガントではない)に任意のコードを追加することなく、if-elseバリアントを使用します。

    はその問題には2つの可能なフォールバックがあります。

  2. -[NSProcessInfo isOperatingSystemAtLeastVersion:]などの古いアプローチを引き続き使用してください。

@availableを使用する別の方法はありますか?

+1

私はLLVMの記事を読んできましたが、ifの中の他の条件や命令で '@ available'を使うことはできません。ですから、基本的に私が考えることができる唯一の方法は、空の 'if'ボディを持ち、' ​​else'ブロック内でアクションを実行することです。これは私にとって唯一可能な方法と思われる。 – cramopy

+0

"これはうまくいかないようですが、Xcodeから次のような警告が表示されています。「警告があっても機能しないというわけではありません。この警告では、可用性を守ることはできないが、バージョンチェックとしてだけ使用しているだけで、可用性を守るのではないという。 – user102008

答えて

0

アプリケーション全体で使用できる独自のカスタムマクロを定義できます。例: -

#define isIOS11() ([[UIDevice currentDevice].systemVersion doubleValue]>= 11.0 && [[UIDevice currentDevice].systemVersion doubleValue] < 12.0) 

または

#define SinceIOS9_2 ([[UIDevice currentDevice].systemVersion doubleValue]>= 4.2 && [[UIDevice currentDevice].systemVersion doubleValue] < 9.2) 

以下のようにそれを使用します。 -

if (isIOS11()) { 
    // Do something for iOS 11 
} else { 
    // Do something iOS Versions below 11.0 
} 

これはあなたのために働く場合は私に知らせてください。

+0

これはきれいです。私はいつかそれを試してみたいと思う。ありがとう! – Akaino

+0

これは、Xcode 9の新しい "Unguarded Availability"警告を抑制することはありません。 – StatusReport

関連する問題