Learn Swift / サンプルプログラム Memo Pad 5
このコーナーでは、Swift による、Mac OS X アプリケーションの作成方法を、説明しています。
掲載開始日:2016年02月12日
最終更新日:2016年02月14日
home 目次 前へ 次へ mail
Value Transformer
ArrayController の selectionIndex は、配列の要素番号を返します。配列の要素番号は 0 から始まります。通常、コントローラをコードで記述するのであれば、返される要素番号に 1 を足して 1 から始まる番号に変えることは簡単です。しかし、ArrayController にコードを記述する場所はありません。このような場合、Cocoa バインディングでは、value transformer (値変化器) というオブジェクトを使います。Value Transformer はNSValueTransformer というクラスを継承して作ります。
AddOne クラスの作成
ナビゲータエリアで、Memo Pad フォルダを選択して、「File」メニュー → 「New」→「File..」を選択してください。
次のパネルで「OS X」→「Source」→「Cocoa Class」を選択して、Next をクリックしてください。
次のパネルで Class に「AddOne」と入力して、Subclass of に「NSValueTransformer」と入力してください。Language は「Swift」を選びます。そして、Next をクリックしてください。なお、Subclass of の項目は、プルダウンメニューを使って選ぶこともできます。
次のパネルでは、デフォルトのまま「Create」をクリックしてください。
AddOne クラスのコーディング
ナビゲータエリアで、追加された AddOne.swift を選択して、エディタエリアに AddOne.swift のコードを表示させてください。そして次のリストのコードを追加してください。太字部分が追加するコードです。冒頭のコメント部分は省略しています。
import Cocoa @objc(AddOne) class AddOne: NSValueTransformer { override func transformedValue(value: AnyObject?) -> AnyObject? { var num = value!.intValue num! += 1 return NSNumber.init(int: num) } }
- @objc(AddOne)
- プロジェクトに後から追加したクラスには、このコードを記述しないと、Cocoa バインディングは、このクラスを見つけることができません。
- override func transformedValue(value: AnyObject?) -> AnyObject?
- NSValueTransformer に用意されているメソッドです。AnyObject 型を受けて、AnyObject 型を返します。
- var num = value!.intValue
- 引数 value を非オプショナル化して、32ビット符号付き整数に変換しています。そして変換された値は、変数 num に代入されています。intValue は、NSObject に用意されているメソッドです。
- num! += 1
- オプショナル型は、そのままでは演算することができません。しかしnum はすでに非オプショナル化されていますが、ここでも「!」をつけないとコンパイルエラーになります。
- return NSNumber.init(int: num)
- num を NSNumber に変換して、戻しています。NSNumber は、AnyObject 型として戻せるみたいです。
AddOne クラスを採用する。
ストーリーボードを表示して、ラベルを選択してください。そしてバインディングインスペクタで「Value With Pattern」グループの「Display Pattern Value1」を開いてください。そして、Value Transformer 項目のプルダウンメニューから「AddOne」を選びます。
テスト
Memo Pad を実行すると、メモが一つもない場合、ラベルには「0 of 0」と表示されます。そして、メモを追加すると、インデックス番号が 1 から始まるように修正されています。Remove ボタン、Back ボタン、Next ボタンではどうなるかも試してみてください。
お疲れ様でした。
次のページでは、Memo Pad に、ファイル入出力機能を追加します。
無断転載禁止、リンクフリー Copyright 2016. vivacocoa.jp All right reserved.