Xcode 9を使用して、iOS 10のみをサポートするXcode 8でプロジェクトをコンパイルするオプションを維持しながら、iOS 11コードをプロジェクトに追加します。
Objective-Cでは、プリプロセッサディレクティブを使用して___IPHONE_11_0
_が定義されているかどうかを確認することでこれを実行できます。 iOS 11より前のBase SDKでコンパイルしている場合、コードは非表示になります。このように:
_#ifdef __IPHONE_11_0
if (@available(iOS 11.0, *)) {
self.navigationController.navigationBar.prefersLargeTitles = YES;
}
#endif
_
Swiftでそれを行う方法はありますか?
if #available(iOS 11.0, *)
は、ランタイムチェックであるため機能しません。
IOS 11 SDKにはSwift 3.2(またはSwift 4)が付属しているため、Swift=バージョンチェックを使用して、同じことを達成する:
#if Swift(>=3.2)
if #available(iOS 11.0, *) {
…
}
#endif
これはAppleが提案する解決策です。
if #available(iOS 11.0, *) {
// iOS 11 specific stuff here
} else {
// non iOS 11 stuff here
}
このリソース を参照してください(詳細については、マーク6:50のビデオをご覧ください)
関数の外に条件を置きたい場合、以下のようにできます。
@available(iOS 11.0, *)
func functionName() {
// function contents
}
わかります。使用したい古いMacがXcode 9には古すぎるため、Xcode 8でプロジェクトをコンパイルできる場合もあります。
ただし、iOS 10とiOS 11の両方をサポートするだけであれば、Xcodeターゲットの最小SDKを10.0に設定し、常にiOS 11 SDKでコンパイルするだけです。 Swiftはあなたのために働きます、そしてあなたが正しく使用しない限り構文エラーを与えますif #available(iOS 11.0、*){
IOS 10とiOS 11の両方でテストすることはできますが、Xcode 8を使用する必要はありません。
Xcode 8の観点からは、将来のソースコードをコンパイルしようとしています。 Xcode 8に適したソリューションはありません。
今後の解決策は次のとおりです。
Xcode 9.3(Swift 4.1)では、次のように言うことができます。
#if canImport(MagiciOS12Kit)
if #available(iOS 12.0, *) {
MagiciOS12Class.standard.method()
}
#endif
コードは引き続きXcode 9.3でコンパイルされますが、仮想Xcode 10.0以降が必要な将来のものはスキップします。
#if canImport(moduleName)は、Swift 4.1、Xcode 8では処理できません。ただし、これでもAppleは将来的に追加されます。Appleは、navigationController.navigationBar.prefersLargeTitlesのように、既存のクラスを新しいメソッドで単に拡張するだけです。 prefersLargeTitlesを直接テストできますが、Apple prefersLargeTitlesと同時に導入された別のフレームワークを見つけて確認できます#if canImport(…)を使用したそのフレームワークの存在。
@available(iOS 11.0, *)
func myFunction() {
// function defination
}
if #available(iOS 11.0, *) {
// iOS 11 specific stuff here
} else if #available(iOS 10.0, *) {
// iOS 10 specific stuff here
} else {
// non iOS 11 & 10 stuff here
}