web-dev-qa-db-ja.com

Objective-Cの「#ifdef __IPHONE_11_0」に相当するSwiftとは何ですか?

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, *)は、ランタイムチェックであるため機能しません。

18
Matthias Bauch

IOS 11 SDKにはSwift 3.2(またはSwift 4)が付属しているため、Swift=バージョンチェックを使用して、同じことを達成する:

#if Swift(>=3.2)
    if #available(iOS 11.0, *) {
        …
    }
#endif
16
Lily Ballard

これはAppleが提案する解決策です。

if #available(iOS 11.0, *) {
    // iOS 11 specific stuff here
} else {
    // non iOS 11 stuff here
}

このリソース を参照してください(詳細については、マーク6:50のビデオをご覧ください)

4
pesch

関数の外に条件を置きたい場合、以下のようにできます。

@available(iOS 11.0, *)
func functionName() {
 // function contents
}
1
Carly

わかります。使用したい古い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(…)を使用したそのフレームワークの存在。

0

以下のような機能に対してこれを行うことで達成できます

@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
}
0
Prabhat Pandey