Swift Playgroundsで学ぶiOSプログラミング 第58回
最新バージョンでのエラー対処法
Swift 4.0への対応と超簡単なHLSビデオプレーヤーを作成
2017年10月30日 17時00分更新
突然ですが、現時点で最新のSwift Playgroundsのバージョンは1.6(674.15)です。実際の記事の公開タイミングとは少しずれていますが、原稿執筆のタイミングで言えば、数日前にiOS 11とほぼ同時に登場したばかりです。このバージョンの特徴は、プログラミング言語としてSwift 4.0に、OSとしてはiOS 11に対応したことです。とはいえ、当然、と言えるかどうかわかりませんが、これまでのiOS 10にも対応していて、iOS 10でもSwift 4.0でのプログラミングが可能となっています。というのも、Swift Playgroundsは、コンシューマー向けの特殊なIDEのようなものなので、Swift言語のコンパイラーは自分で持っているからです。
それはともかく、Swift 4はこれまでのSwift 3と互換性があるのが1つのウリになっています。そこでSwift 4になっても、これまでこの連載で紹介してきたSwift 3のプログラムは、ほとんどそのまま動くのではないかと期待していました。それは「ほとんど」の程度にもよるのですが、だいたい期待どおりのようです。しかし、比較的よく登場するフレーズで、明示的にSwift 4に対応させる必要がある記述もありました。
今回は、まずその対応方法を解説したあと、驚くほど簡単にできるビデオプレーヤーの作り方を取り上げることにします。
ターゲットのメソッドに「@objc」を付ける
直近の例として、前回に作成したオーディオプレーヤーを見てみましょう。新しいSwift Playgrounds 1.6で開くと、残念ながらエラーが出てしまいます。
1つの画面にいくつもエラーが表示されると悲愴な気分になりますが、気を取り直して赤い丸で示されたエラーが出ている行をよく見て見ましょう。すると、どれも基本的に1つのパターンにマッチしていることに気づきます。それは表面的には#selectorというキーワードを含んでいる行です。この意味は、ユーザーがUIKitの部品を操作した際などに、そのアクションとして機能するメソッドの名前を指定している部分です。多くはUIKitの部品のaddTargetオブジェクトですが、先週のプログラムで使っているコアアニメーションのタイマーを設定するCADisplayLinkクラスの初期化部分にも、やはり#selectorがあり、エラーになっています。根は同じです。
Swift Playgroundsでは、赤い丸の部分をタップすると、エラーの内容をできるだけ詳しく表示し、多くの場合、それを修正するための解決策を示してくれます。
このエラーの意味は「#selectorを使って指定したメソッドが、Objective-Cからは見えていない」といったものです。わかりにくいかもしれませんが、ということは、つまりこの#selectorを使ってメソッドを指定する部分はObjective-Cの機能を使っていることになります。それに対して、後ろのほうで定義しているメソッドはSwiftのものなので、そこに直接飛ぶことができないと言っているのです。
Swift 4になっても「まだObjective-Cなのか」と思われるかもしれませんが、このようにプログラムの中で飛び先をダイナミックに指定できるのは、Objective-Cならではの特徴というわけでしょう。「Swiftの世界だけで済ますことはできないのか」とも思われるかもしれません。しかし、AppleのSwift 4の公式ドキュメントを見ても、プログラムでターゲットをセレクターとして指定するには、このような書き方が標準とされています。
ともあれ、このエラーの説明には「修正」ボタンが用意されているので、ためらわずにタップしましょう。すると、このエラーが表示されていた部分は何も変更されていないのにエラーは消えます。変更されるのは飛び先のほうです。この場合は、pButtonTappedメソッドの定義部分です。
ここには、メソッドを定義するためのfuncというキーワードの前に、さらに@objcが追加されています。これにより、このメソッドはObjective-Cのメソッド、言い換えればObjective-Cの世界から呼び出すことのできるメソッドとして定義したことになります。このように、#selectorで指定したすべてのメソッドの定義の前に@objcを付ければ、この種のエラーはすべて消滅し、Swift Playgrounds 1.6の上で先週のプログラムを動かすことができます。言うまでもなく、それ以前のプログラムも、ターゲットをセレクターとして設定している部分では、すべて同じエラーが出るので、このようにして修正してください。
なお、この@objcというコンパイラーに対する指示は、Swift 4になって初めて導入されたわけではありません。実はSwift 3でも、セレクターのメソッドは、厳密にはこのように書くべきだったのです。Swift 3まではチェックが甘く、まあいいか、という状態だったのが、Swift 4になってより厳しくなったと考えるべきでしょう。
この連載の記事
- 第100回 SceneKitの物理現象シミュレーションとアニメーションをARKitに持ち込む
- 第99回 「物理学体」と「物理学場」を設定して物理現象をシミュレーション
- 第98回 SceneKitのノードに動きを加えるプログラム
- 第97回 いろいろな形のノードをシーンの中に配置する
- 第96回 SceneKitの基礎シーンビュー、シーン、ノードを理解する
- 第95回 現実世界の床にボールや自動車のモデルを配置する
- 第94回 ARKitを使って非現実世界との融合に備える
- 第93回 ARKitが使えるiPadを識別するプログラム
- 第92回 Swift Playgrounds 2.1での問題点をまとめて解消する
- 第91回 iPadの内蔵カメラで撮影した写真を認識するプログラム
- この連載の一覧へ