Learn Swift / viva Cocoa / viva Cocoa


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 に、ファイル入出力機能を追加します。


home  目次  前へ  次へ  mail


無断転載禁止、リンクフリー
Copyright 2016. vivacocoa.jp All right reserved.