Swiftで遊ぼう! on Hatena

あしたさぬきblogでやってた初心者オヤジのiOSプログラミング奮闘記がHatenaに来ました

Swiftで遊ぼう! - 237 - Property List DemoからAnyObjectの復習

2016年12月3日:Swift 3に向けた改訂

さあ、講義の中でデモが始まったのだが...

やはり、前の講義をスルーしてしまった感じで、どうもついていけなくなっているので、講義4「More Swift and Foundation Frameworks」に戻って、AnyObjectの話の復習を聴く(^_^;)

AnyObjectは、既存のObjective-Cで書かれたAPIと互換性を持たせるための特別な「Type」であり、これは実際のところ「プロトコール」にあたる。

うーん、なんとも理解し難い項目だ。

API群のクラスが分からなくても扱えるようにする方法なんだろう。

でも、使用するときに必ずキャストしてやらないといけない。

その方法があります。

  1. as
  2. as?
  3. is
  4. 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」に「!」をつけると強制的変換を意味し、「?」をつけるとオプショナルを意味するようになりました。

  • Guaranteed conversion(保証された変換):他のタイプへの変換が保証されている変換のことですね。これはSwiftコンパイラーで保証されている。例えば、アップキャスティング(上位のクラスに変換する場合)とか、文字タイプの特定( 1 as Float)などである。
  • Forced conversion(強制的に変換):Swiftコンパイラーで保証されていないタイプへの変換で、これはランタイム時にエラーに陥る可能性がある。例えば、サブクラスへダウンキャストする場合だ。