Swiftで遊ぼう! - 237 - Property List DemoからAnyObjectの復習
- Swiftで遊ぼう!の前書き-> Life-LOG OtherSide
- 初心者はここから!-> 50オヤジでもできるiOS開発
- 私の本業、オフィシャルなブログ-> Life-LOG
- Swift 3 対応
2016年12月3日:Swift 3に向けた改訂
さあ、講義の中でデモが始まったのだが...
やはり、前の講義をスルーしてしまった感じで、どうもついていけなくなっているので、講義4「More Swift and Foundation Frameworks」に戻って、AnyObjectの話の復習を聴く(^_^;)
AnyObjectは、既存のObjective-Cで書かれたAPIと互換性を持たせるための特別な「Type」であり、これは実際のところ「プロトコール」にあたる。
うーん、なんとも理解し難い項目だ。
API群のクラスが分からなくても扱えるようにする方法なんだろう。
でも、使用するときに必ずキャストしてやらないといけない。
その方法があります。
- as
- as?
- is
- as!
これを1つずつ説明をしてみます。次のプロパティを用意します。
var destinationViewController: AnyObject?
当然、この宣言をしたところで「nil」です。
var calcVC = destinationViewController as UIViewController
これはクラッシュしてしまいます。「nil」をキャストすることができないからです。次はどうでしょう。
var calcVC = destinationViewController as? UIViewController
これの場合、ちゃんと「nil」になります。そして型変換は「UIViewControll?型」に変換されています。次のようにコードできるからです。
var calcVC = destinationViewController as? UIViewController var concreteVC = UIViewController() calcVC = concreteVC // しかし、「calcVC」実際使用する時はアンラップが必要です。
そして、「is」は次のように判定することができます。
if destinationViewController is UIViewController { print("UIViewController??") } else { print("nil") } // "nil"
「as!」がどうして最後かと言えば、Swift Swift1.2以前のバージョンでは、以下の状態を区別させるサフィックスは用意されてい無かったんです。Swift 3で当たり前になっていますが、「as」に「!」をつけると強制的変換を意味し、「?」をつけるとオプショナルを意味するようになりました。