この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
OS バージョンに応じて動的に処理分岐
WWDC 2015 では、Swift の言語仕様が大きく変更され、Swift 2.0 としてリニューアルされる事が発表されました。
今回は、変更点の中から、カンタンに OS バージョンに応じた振る舞いをさせる新しい方法についてご紹介します。
参照:Using Swift with Cocoa and Objective-C: Adopting Cocoa Design Patterns
使いドコロとしては、最新の iOS でアプリが実行されているときは、新しく追加された便利APIを使い、そうでない時は、代替の方法を使うといったところでしょうか。
構文
以下の構文を使います。
if #available (OSの種類 バージョン, *) {
// 処理A
} else {
// 処理B
}
例えば、以下のようになります。
if #available (iOS 9.0, *) {
// 処理A
} else {
// 処理B
}
この場合、iOS 9.0 以降でアプリが動作している場合は処理Aが実行され、そうでない場合は、処理Bが走ります。
※もし deployment target が iOS 9.0 の場合、ビルドは可能ですが、チェックする必要がそもそも無いので、その旨Xcode側でお知らせをしてくれるようです。
複数のOSを指定することもできます。
if #available(iOS 9.0, watchOS 2.0, OSX 10.10.3, *) {
// 処理A
} else {
// 処理B
}
将来新しいプラットフォームが出た時のため、必ず最後に, *を付ける必要があります。
例
var str = "Steven Paul Jobs"
if #available(iOS 9.0, *) {
let nameComponents = NSPersonNameComponents.new()
nameComponents.familyName = "Jobs"
nameComponents.givenName = "Steven"
nameComponents.middleName = "Paul"
let nameComponentsFormatter = NSPersonNameComponentsFormatter.new()
nameComponentsFormatter.style = NSPersonNameComponentsFormatterStyle.Abbreviated
str = nameComponentsFormatter.stringFromPersonNameComponents(nameComponents)
} else {
// Fallback on earlier versions
}
print(str)
iOS 9.0 以降では、人の名前をベンリに扱うことのできるクラスが追加されています。例えば、NSPersonNameComponents は、人の姓名・ミドルネームなどのプロパティを持っていて、他と組み合わせて使うことで、略称などを表示させたりできます。
もちろん、これらクラスを iOS 8 の iPhone で動作させることはできません。そこで、availabilityでのチェックを行い、OSバージョンに応じた処理を指定ます。
実行結果
iOS 8.x まで
Steven Paul Jobs
iOS 9.0 以降
SPJ
おまけ
if #available(iOS 10.0, watchOS 3.0, OSX 20.0.0, *) {
print("Future!")
}
未来を感じますね!