_#available
_は、watchOSとiOSを区別するときに機能しないようです。
IOSとwatchOSの間で共有されるコードの例を次に示します。
_lazy var session: WCSession = {
let session = WCSession.defaultSession()
session.delegate = self
return session
}()
_
.。
_if #available(iOS 9.0, *) {
guard session.paired else { throw WatchBridgeError.NotPaired } // paired is not available
guard session.watchAppInstalled else { throw WatchBridgeError.NoWatchApp } // watchAppInstalled is not available
}
guard session.reachable else { throw WatchBridgeError.NoConnection }
_
デフォルトはWatchOSであり、_#available
_はコンパイラによって考慮されていないようです。
このAPIを誤用していますか、それともiOSとWatchOSをコードで区別する他の方法はありますか?
更新:BPCorpで言及されているようにAPIを誤用していたようです
上記のコードにTaliのソリューションを使用すると、次のように機能します。
_ #if os(iOS)
guard session.paired else { throw WatchBridgeError.NotPaired }
guard session.watchAppInstalled else { throw WatchBridgeError.NoWatchApp }
#endif
guard session.reachable else { throw WatchBridgeError.NoConnection }
_
残念ながら、Xcode 7GMの時点では#if os(watchOS)
..
編集:いつ追加されたかはわかりませんが、Xcode7.2で#if os(watchOS)
を実行できるようになりました
そのコードをiOSでのみ実行する場合は、#if os(iOS)
の代わりにif #available(iOS ...)
を使用します。
このように、オペレーティングシステムのバージョンの動的チェックを使用していませんが、OSごとに異なるコードをコンパイルしています。
Apple dev guide では、スター_*
_(必須)は、指定されていないがリストされているOSに対してif
本体を実行することを意味すると言われています。ターゲットによって指定された最小デプロイメントターゲット。
したがって、ターゲットがiOSおよびwatchOSを指定している場合、ステートメントif #available(iOS 9.0, *)
は、if
bodyがiOSで使用可能であることを意味します9以降および任意のwatchOSバージョン。
また、この「ビルド構成」の章で説明されているものを使用する場合は注意してください Appleガイド 。これは、オペレーティングシステムに基づいてコードを条件付きでコンパイルするために使用されます。これは実行時に動的ではありません。
GMバージョンのXcode7で、彼らはその問題を修正したと思います。私にとって:
if #available(watchOS 2,*) {
// Only if using WatchOS 2 or higher
}
GMバージョンで正常に動作しています。