2014年12月24日
Posted by 屋台ブルー at
2014年12月24日00:00 Comment(0)
Swiftで遊ぼう! - 166 - プロパティ(Properties)
Swiftで遊ぼう! - 154 - アプリを作ろう - 3 Outlet のコメントに対する考察
柔軟性を失ったオヤジの理解力では間違いや思い込みが甚だしい。理解したと思っていたことでも勘違いしていることもある。
「Swiftで遊ぼう!」シリーズ初期の頃からアドバイスをくださるNao大先生(←勝手に大先生と呼んでます)からプロパティに関する間違った認識を指摘されました。こういうツッコミが入ると本当に助かります。復習するチャンスってことですよね。
ということでプロパティの勉強をもう一度やり直します。ここのブログでプロパティの項目を探してみましたが、中途半端な説明しか無かったですね。
Swiftで遊ぼう! - 5 なんだなんだLazy?
Swiftで遊ぼう! - 6 セッター、ゲッター、何のコッチャー
じゃあ、今回は正本The Swift Programming Language本のプロパティ(Properties)セクションを精読していこう。
じゃあ始めるよ。
「Propeties associate values with a particular class, structure, or enumeration.」
この冒頭の文章を読んで、「あっ!Naoさんの言ってることだ」と、ピーンと感じました。このセンテンスが、「Properties are values with a particular class, sturucture, or enumaeration」ではなく、「associate(関連付ける)」を使っているところがミソでしたね。プロパティが値じゃないんですね。
Naoさんの仰っていた次の通りだと思う。
しかし、もう少しツッコんで理解しなければならないのが、Naoさんの次の言葉だろう。
Naoさんの言うとおり、OOPのプログラミング技法に行きついた理由を理解するために過去から脈々と続くプログラミング技法の変化の歴史を知る必要がある。数々の制限(限られたメモリやプロセッサー能力)がある環境で工夫されてきた技法は、裏を返せば簡単に変わらないとも言える。今のように制限が解き放たてきていてもOOPはしばらくプログラミング技法の中心に鎮座し続けるだろう。関数型プログラミング(私はまだよく分かってないけど)へ変化し始めている中、最もモダンと形容されるSwiftでさえも、旧来のやり方を踏襲しながら新しい概念を取り入れている訳で、新旧混在する今の状況はしばらく続くでしょう。
ということで、正本The Swift Programming Language本を精読して、古い概念と新しい概念の混在も見極めないといけないんでしょうね。特に私のようにObject-Cを全く知らない素人でありながら独学でプログラミングを勉強している人にとって
Swiftで使われているプロパティを考えてみよう。
1) Stored Properties(保持型プロパティ)
- Lazy Stored Properties
2) Computed Properties(計算型プロパティ)
- set, get:セッターを省略すると、自動的に「newValue」が利用される。
- Read-Only Computed Properties
3) Property Observers
- willSet, didSet:willSetは値を保持しないのでコンスタント値のパラメーターを()を使って与えないといけない。何も書かなかったら「newValue」が利用される。 didSetも同様ですが、何も書かなかったら「oldValue」が利用される。プロパティの初期化の時には呼ばれないけど、それ以外でプロパティに値がセットされた時(同じ値としても)に必ず呼ばれる。
4) Type Properties
- static var, class var
この4つの項目にプロパティが使われていて説明があるけど、Object-Cの経験者が知っておくべき説明文があった「Stored Properties and Instance Variables」というセクションだけど、ここを精読しておこう。
まず、Stored Propertiesであるが、クラスと構造体(Structure)のインスタンスの一部として、変数(var)もしくは定数(let)の値を保持することができる。クラスでもStructureでもインスタンス生成時、初期化ステップにおいて値を保持させる。しかし、宣言していても初期化ステップで値を保持させなかった場合はコンパイルエラーに陥る。Swiftでは、それを避けるためにオプショナル値を設定するか、Lazy Stored Propertiesにしなければならないということかな。
私が勘違いしていたのは、プロパティにしろクラスにしろ「宣言」と「インスタンス生成」を混同してしまっていたのでNaoさんに誤解を与えていたと思う。
Swiftで遊ぼう! - 154 - アプリを作ろう - 3 Outletの冒頭で、「クラスインスタンスではなくプロパティなので注意しなければならない」と書いているが、これは間違いだ。クラスインスタンスが一部にプロパティを持つことができるので、クラスインスタンスとプロパティを同列に語ることはできないね。
var someButton: UIButton!
Naoさんの仰るように、この宣言文だけでクラスのオブジェクト(インスタンス)を生成しているというのは間違いである。これはあくまでもUIButtonクラスの変数someButtonを宣言だけで、実体の値は無い。実は、この宣言文だけみてプロパティかどうかも分からない。
class ViewController: UIViewController {
var someButton: UIButton!
}
上記のようになると、「var someButton: UIButton!」はUIButtonクラスの変数がプロパティとして宣言されるのでメモリーの確保はされるけど、まだ実体は無い状態です。viewControllerクラスのインスタンスが生成される時、初期化を通してsomeButtonに値が保持されるはずですが、初期終了時までに値が保持されなければ「nil」となるということです。
私の勘違いは、「宣言」と「インスタンス生成」を混同していたことと、また私は、インスタンスの一部になるメソッドもプロパティと思っていたので勘違いですね。
さて、まだ私は勘違いしているのでしょうか?
プロパティの話の続きは「初期化」でします。また後日アップ予定なのでお待ちを。
柔軟性を失ったオヤジの理解力では間違いや思い込みが甚だしい。理解したと思っていたことでも勘違いしていることもある。
「Swiftで遊ぼう!」シリーズ初期の頃からアドバイスをくださるNao大先生(←勝手に大先生と呼んでます)からプロパティに関する間違った認識を指摘されました。こういうツッコミが入ると本当に助かります。復習するチャンスってことですよね。
ということでプロパティの勉強をもう一度やり直します。ここのブログでプロパティの項目を探してみましたが、中途半端な説明しか無かったですね。
Swiftで遊ぼう! - 5 なんだなんだLazy?
Swiftで遊ぼう! - 6 セッター、ゲッター、何のコッチャー
じゃあ、今回は正本The Swift Programming Language本のプロパティ(Properties)セクションを精読していこう。
じゃあ始めるよ。
「Propeties associate values with a particular class, structure, or enumeration.」
この冒頭の文章を読んで、「あっ!Naoさんの言ってることだ」と、ピーンと感じました。このセンテンスが、「Properties are values with a particular class, sturucture, or enumaeration」ではなく、「associate(関連付ける)」を使っているところがミソでしたね。プロパティが値じゃないんですね。
Naoさんの仰っていた次の通りだと思う。
プロパティとは、変数の一種と思っていただいたほうが良いと思います。普通の変数と異なるのは、読み書きの時に、その値を直接読み書きするのではなく、内部的にメソッド(関数)を利用するという点です。「内部的に」とは、プログラム上は普通に変数を読み書きしているように見えるけど、コンパイラが自動的にメソッドを作ってそれをアクセスしているという意味です。
しかし、もう少しツッコんで理解しなければならないのが、Naoさんの次の言葉だろう。
なぜこのような仕組みになっているのかというと、オブジェクト指向プログラミングの歴史を勉強していただけるとわかると思います。
Naoさんの言うとおり、OOPのプログラミング技法に行きついた理由を理解するために過去から脈々と続くプログラミング技法の変化の歴史を知る必要がある。数々の制限(限られたメモリやプロセッサー能力)がある環境で工夫されてきた技法は、裏を返せば簡単に変わらないとも言える。今のように制限が解き放たてきていてもOOPはしばらくプログラミング技法の中心に鎮座し続けるだろう。関数型プログラミング(私はまだよく分かってないけど)へ変化し始めている中、最もモダンと形容されるSwiftでさえも、旧来のやり方を踏襲しながら新しい概念を取り入れている訳で、新旧混在する今の状況はしばらく続くでしょう。
ということで、正本The Swift Programming Language本を精読して、古い概念と新しい概念の混在も見極めないといけないんでしょうね。特に私のようにObject-Cを全く知らない素人でありながら独学でプログラミングを勉強している人にとって
Swiftで使われているプロパティを考えてみよう。
1) Stored Properties(保持型プロパティ)
- Lazy Stored Properties
2) Computed Properties(計算型プロパティ)
- set, get:セッターを省略すると、自動的に「newValue」が利用される。
- Read-Only Computed Properties
3) Property Observers
- willSet, didSet:willSetは値を保持しないのでコンスタント値のパラメーターを()を使って与えないといけない。何も書かなかったら「newValue」が利用される。 didSetも同様ですが、何も書かなかったら「oldValue」が利用される。プロパティの初期化の時には呼ばれないけど、それ以外でプロパティに値がセットされた時(同じ値としても)に必ず呼ばれる。
4) Type Properties
- static var, class var
この4つの項目にプロパティが使われていて説明があるけど、Object-Cの経験者が知っておくべき説明文があった「Stored Properties and Instance Variables」というセクションだけど、ここを精読しておこう。
Object-Cの経験者だったら、クラス・インスタンスの一部としての値とリファレンス値を保持をする2通りの方法を知っているだろう。プロパティ以外にも、プロパティの値を保持する補助的保持にインスタンス・バリアブルを使うことができる。Swift言語ではこれらを統合して単一プロパティ宣言にした。Swiftのプロパティにはインスタンス・バリアブルと同等のものを持っていないし、プロパティの補助的保持値にアクセスすることはできない。これは様々な状況下で値にアクセスしていた混乱性を避け、プロパティの宣言をたった1つの完全なステートメントの中でさせる単純化を試みている。全ての情報、名前、型、メモリーマネージメント、そして特質?(Characteristcics)まで含めた全てのプロパティ情報を型定義の一部分として1箇所で定義させている。
まず、Stored Propertiesであるが、クラスと構造体(Structure)のインスタンスの一部として、変数(var)もしくは定数(let)の値を保持することができる。クラスでもStructureでもインスタンス生成時、初期化ステップにおいて値を保持させる。しかし、宣言していても初期化ステップで値を保持させなかった場合はコンパイルエラーに陥る。Swiftでは、それを避けるためにオプショナル値を設定するか、Lazy Stored Propertiesにしなければならないということかな。
私が勘違いしていたのは、プロパティにしろクラスにしろ「宣言」と「インスタンス生成」を混同してしまっていたのでNaoさんに誤解を与えていたと思う。
Swiftで遊ぼう! - 154 - アプリを作ろう - 3 Outletの冒頭で、「クラスインスタンスではなくプロパティなので注意しなければならない」と書いているが、これは間違いだ。クラスインスタンスが一部にプロパティを持つことができるので、クラスインスタンスとプロパティを同列に語ることはできないね。
var someButton: UIButton!
Naoさんの仰るように、この宣言文だけでクラスのオブジェクト(インスタンス)を生成しているというのは間違いである。これはあくまでもUIButtonクラスの変数someButtonを宣言だけで、実体の値は無い。実は、この宣言文だけみてプロパティかどうかも分からない。
class ViewController: UIViewController {
var someButton: UIButton!
}
上記のようになると、「var someButton: UIButton!」はUIButtonクラスの変数がプロパティとして宣言されるのでメモリーの確保はされるけど、まだ実体は無い状態です。viewControllerクラスのインスタンスが生成される時、初期化を通してsomeButtonに値が保持されるはずですが、初期終了時までに値が保持されなければ「nil」となるということです。
私の勘違いは、「宣言」と「インスタンス生成」を混同していたことと、また私は、インスタンスの一部になるメソッドもプロパティと思っていたので勘違いですね。
さて、まだ私は勘違いしているのでしょうか?
プロパティの話の続きは「初期化」でします。また後日アップ予定なのでお待ちを。