[OS X] 他のオブジェクトから情報を得るには

めも。

デリゲーションによってオブジェクト間の情報伝達ができるよ。という話題。
Protocols part 2 : Delegation

前にサンプルコードをいろいろ載せてるページを見つけてたけど、そこにもサンプルがあった。
概念じゃなく具体的に実装で説明してるから、こっちの方が分かりやすいかな。

情報が古いせいか、これはちょっと違うっぽい…

きんくまさんのページに、プロトコルのことが書かれていた。
どこかでも見たけど、Protocol-Delegationパターンというらしい。
オブジェクトから直接インターフェースを生やす手もあるけど、プロトコルに仲介させることで疎結合にできるのが良いんだ。と書かれている。

疎結合というのは、コンポーネント同士があんまり相手を選ばないし、居るか居ないかも気にしないで動く。ゆるく協調しあうような状態のこと。

…あんまり相手を選ばない、というのも語弊があるか。。わりと汎用的なインターフェースを用意することで、新しく別のコンポーネントと結合しようとした場合でも、無理のない結合を可能にできる。というくらいの意味。
選ばない。というか、誰でも利用していいよ。ウェルカムだよ。みたいな感じ。逆に「選ぶ」ものは、閉鎖的というかガチガチに固まったインターフェース。非常に手続き的。

疎結合は、あまり手続きが必要ない。シンプルなやりとりが基本。って感じかな。

デリゲート難しいなー。こんなページも見つけた。
[iOS] iOSのDelegateをしっかりと理解する
なんか、しっかり理解してないと正直関連が全然見えなくて、全く実装できる気がしない…

“[iOS] iOSのDelegateをしっかりと理解する” のページを見ながら整理してみた。

定義が煩雑なので、とにかくやっていることを整理してみた。

  • View
    • protocol公開
    • delegate公開
    • 設定済みdelegateの利用
  • Controller
    • protocol実装
    • delegate設定

整理してみると、意外なほどにシンプルになった…
定義や動作について、順を追ってみるとこんな感じ。

・Viewにて、外部クラスに使って欲しいProtocolを定義&公開。
 ※公開したProtocolは定義だけで、このクラスに実装はない。
・また、Protocolを使ってくれるクラスのインスタンスを収めるdelegateも定義&公開。
・Controllerにて、Viewが公開しているProtocolの実装をし、公開。
・また、Protocolを公開しているクラス側のインスタンス(のdelegate)に、自分のインスタンスを設定。
・Viewにて、自分のメンバ(delegate)に設定されたインスタンスを用いて、その設定されたインスタンスのクラスが公開しているProtocol実装を呼び出す。
 ※この最後のProtocol実装の呼び出しにより、ControllerからViewに値が受け渡される。

[OS X] 作図ツール

めも。

プログラムを書くのに作図ツールが欲しくなって調べたら、こんなのが出てきた。ソースも公開されている。(まぁ、これは線グラフを書くのが目的だけども…)

お絵描きツールを書こうと思ってたけど、ある程度似たようなプログラムのコードを得てしまった感じ…

[OS X] iOSじゃないアプリを作ろうとしたら躓いた

XCodeでツールのインターフェースは共通だし、基本のクラス名も同じっぽいのでサクッと作れたりするのかしら…と思ってOSXのアプリのプロジェクトを作ってみたけど、なんか全然思うように書けない。。

そもそもiOSの実装も基礎ができてないということかもしれないが、ちょっとCocoaを調べることにした。

そもそもCocoaって何?

OSXのUI層部分のアプリケーション構築用のフレームワーク(というか、API群)。
AppKitとも呼ばれる。125のクラスとプロトコルから構成されていて、すべてのクラスはNSObjectから派生する。

OSXで動くアプリケーションの素になるフレームワーク。という理解でよさそう。

ちなみに、旧OSであるMacOSはCarbonって名称のAPIがあった。

iOSもCocoa-touchってフレームワークを使うので、基本部分は共通のはず。
ただベースになっているOSが同じわけではないし、共通する部分がある。という感じなんだろう。

Cocoaでウィンドウアプリ作るにはどうすれば?

こういう時は、素直に開発会社のチュートリアルに従うまでです。

ここがデベロッパ向けの情報サイト:Mac Developer Library

Start Developing Mac Apps Today というページがあったので、まずはここからみてみよう。

はじめての Mac アプリ(Your First Mac App)

Jump Right Inのページの最後にあるリンクを辿ると説明されている。
この “はじめてのアプリ” は、ウィンドウに3つのコントロール(Text-field, Slider, Button)を置いたアプリ。

…なんだけど、どっちかというとその説明に結構詳しいXCodeの基本説明が書いてある。
ただその説明は基本折り畳まれているので、ふんふんこんなもんなのね…みたいな感じで飛ばし読みすると、あとで訳がわからなくなるかもしれないので、ちゃんと中を確かめながら読み進めたほうがいいかもしれない。

というか、知ってる人はこんなの読まないし、これを読んでる人はちゃんと目を通そう。

たとえば Getting Startedのページでは、こんな事が書かれてますね。

  • プロジェクトの作り方
  • テスト実行の方法
  • main.mファイルの説明
  • .xibファイルの説明(プロジェクト作成時にStoryboard使うにチェックを入れると、このファイルはないので注意)

はじめてのアプリですが、以外と難しい話がガンガン飛び出すので結構覚悟して読まないとあっという間に挫折しそうです。
わからないことは何度でも読んで動かして、ゆっくり理解する必要があると思いました。

これができたら、次に読むのは Mac App Programming Guide かな。

Cocoa Drawing Guide という描画周りのガイドも見つけたけど、なんだか基本の作りを覚えるのが大変なので、本来やりたい部分まで到達するのに時間が掛かりそう。

自分が最初に作ってみようと思ったのは “おえかきアプリ” だったのだけども、これは意外に基本原理からすると面倒な感じかもしれない。。
サンプルを見つけたので貼っておく。AppleのチュートリアルのようなAction,Outlet,Delegateによる作りではないけども、イベントハンドラがコントローラだと考えればMVCモデルと言えなくもない。Windows系でよく見掛ける作りなので、個人的には理解しやすいけども。)

あとで気づいたのだが…

Start Developing Mac Apps Today をさらに読み進むと、Basic Tasks のページでようやく NSObjectなどの説明を行う Acquire Foundational Programming Skills という話題になった。
さらに次のページが Frameworks, Design Patterns, Human Interface Design, App Designと続く。

そもそもこんなに GettingStart が長いと思ってなかったけど、URLを見ると referencelibrary/GettingStarted/RoadMapOSX の文字が…そりゃ長くても当然かもしれんね。。

プログラム中で関数Aから得た戻り値を関数Bに渡す場合に..

 とりあえずPythonベースで話を進めますが、基本的にどんな言語でも似たような話です。

 一連の処理だったら、単に関数Aの戻り値を関数Bに渡せば完了です。
 ※変数:i で受けずに、関数Bの引数の場所に関数Aを書いたってOKです。

 じゃあ関数Aと関数Bが別々のタイミングで実行されるとしたら、どうでしょうか?

 たとえば、以下のような動作をする時などです。
 ・ボタン1を押した時、関数Aが実行される
 ・ボタン2を押した時、関数Aの戻り値を関数Bに渡す

 そうすると、たとえばこんな感じでグローバル変数を介して関数Bに値を渡す必要があります。
 何故なら、ローカル変数の内容はそのローカル変数の有効なスコープ内でしか有効ではなく、スコープを出た(基本的には関数ブロックを抜けたりした)瞬間に解放対象にされて使えなくなってしまうからです。

 似たような方法として、クラスを生成してクラスのメンバとして戻り値を保持する仕組みを作る、という方法がありますが、その場合でもグローバル変数にクラスのインスタンスを格納したりPySideのようなUIのメインループ呼び出しをしてスコープ内を抜けるまでの間のインスタンスの生存期間を確保する必要があります。

 なんにしても生存期間を伸ばすには…
  ・スコープの概念を持つ
  ・スコープの有効範囲を把握する
  ・その上で、グローバル変数・ローカル変数の使い方を再確認する

 そんな事に注意する必要があるかと思います。