新人奮闘記14
iOS 入門
あまり見慣れなかったSwiftのソースコードがあったので、まとめてみました。
位地情報の取得処理の実装時、ユーザーの認証ステータスをチェックするソースがありますが、初心者の自分的には、なんとなくしかわからなかったので、少しピックアップしたいと思います。
例えば、以下のようなソース
どこが、見慣れなかったかというと、上記89行目の、caseに続く.AuthorizedWhenInUseや
.NotDeterminedといった書き方です。ドットから始まっているので、理解するまではふんわりとドットの前にクラス名とか、そういった類のものがあって、省略しているのだろうと推測して、スルーしておりましたが。見かける頻度が高くなるにつれて、見逃せなくなりました。
結論からいうと、列挙型というものが関係しており、複数の値やメソッドをまとめた集合体です。
果物の集合の例を表します。
上のように宣言し
Fruit.appleとして値にアクセスできますが、caseの後のappleやgreapは文字列だから、二重引用符で囲む必要があるんじゃないかと思いましたが、それはString型の事であり、試しに、
Fruit.apple.dynamicTypeと実行してみると、明らかにFruitと出力されます。Fruit型のappleプロパティを宣言したという意味になりました。
では実際の値はどうなるのかというところで、以下を試してみました。
① Fruit.apple.hashValue
② Fruit.apple.hashValue.dynamicType
③ Fruit.lemon.hashValue
[結果]
① 0
② Int.Type
③ 2
以上の結果からcaseの後に宣言した、appleやgrapeはInt型で0から自動的に割りふられている事がわかりました。ちなみにhashValueというプロパティを使うことで、実際のappleやgrapeに割り振られている値にアクセスできます。
Fruit.appleでは、appleやgrape という変数を作っただけじゃないかということで、実際の中身が気になりますが、やはりそういった使い方がありました。それは以下のような宣言です。
先ほどとは違い、Stringを宣言し、各プロパティに文字列として値を挿入しています。
では、上記①、②、③と同じようにアクセスしてみます。
[結果]
① 0
② Int.Type
③ 2
希望としては、文字列のRedやYellow、型はIntではなく、明示的に型宣言したString.Typeとなって欲しかったのですが、アクセスの方法が違っていました。
結論的にはhashValueではなくrawValueでアクセスする。
① Fruit.apple.rawValue
② Fruit.apple.rawValue.dynamicType
③ Fruit.lemon.rawValue
[結果]
① “Red”
② String.Type
③ “Purple”
これで、実際に値を取得する事ができました。ポイントとして、hashValueは名前の通りハッシュ値にアクセス、rawValueは生のデータとかいう意味でしょうか?※あくまでもイメージです。
※ ハッシュ値やrawValueについては割愛させていただきます。
では、初めに宣言したenum(型宣言なし)をrawValueでアクセスすると、どうなるか試してみましたが、コンパイルエラーとなりました。rawValueでアクセスするためには、型宣言が必須となる事がわかりました。
そして、略したアクセスの方法、.AuthorizedWhenInUseや.NotDeterminedは型推論によって省略する事ができます。
先ほどのコードで略してみます。
単純に var a = Fruit.apple
a = .apple
最上位の位地情報承認ステータスの場合はCLAuthorizationStatusという列挙型のプロパティで、AuthorizedWhenInUseやNotDeterminedという値を持っている事が理解できました。
試しにこれらを省略せずに書いてみます。
89行目、91行目が省略無しで記述した例です。
結果として、エラーは出ません。
話がそれてしまいましたが、列挙型の使いどころがまだわからないので、これから学習していきたいと思います。
まとめ
・ 列挙型のプロパティは宣言した型となる。
・ 列挙型のプロパティに割り振られている値はhashValueでアクセスする。
・ プロパティに直接アクセスする場合は、rawValueを使う。
・ ドットから始まるものは、列挙型のプロパティで列挙型の名前が省略されている。
・ 省略ができるのは型推論が行われているため。
admin at 2016年09月22日 10:00:57