Swiftで遊ぼう! - 242 - Protocol Conformance
- Swiftで遊ぼう!の前書き-> Life-LOG OtherSide
- 初心者はここから!-> 50オヤジでもできるiOS開発
- 私の本業、オフィシャルなブログ-> Life-LOG
- Swift 3 対応
2016年12月13日:修正*1
AnyObjectに関して、The Swift Programming Language本にあたって調べてみると、プロトコールの章に説明があります。
まずプロトコールを用意します。
@objc protocol HasArea { var area: Double { get } }
「@objc」は、Objective-Cコードで使われる可能性があれば、必ず付けなければならない枕詞です。例えObjective-Cに組み込んで使うつもりがなくてもiOSフレームワークに組み込んで使う「オプショナル」なプロトーコールを自作する場合でも必要になります。このHasAreaというプロトコールは、ベースクラスが異なって(SwiftやObjective-Cの混在)いても同様な扱い(ポリモーフィズム)ができます。
2つのクラスにHaeAreaプロトコールを実装させていきます。
先ず、CircleクラスにHasAreaを実装します。
class Circle: HasArea { let pi = 3.1415927 var radius: Double var area: Double { return pi * radius * radius } init(radius: Double) { self.radius = radius } }
次にCricleクラスと全く関係の無いCountryクラスにHasAreaを実装させます。
class Country: HasArea { var area: Double init(area: Double) { self.area = area } }
全く共通点の無い2つのクラスに同じプロトコール「HasArea」というインターフェイスを持たせて、プロパティを共通化しました。
もう一つ、全く関係のないもう一つのクラスAnimalを用意します。
class Animal { var legs: Int init(legs: Int) { self.legs = legs } }
そして、継承関係にない全く異なるクラスを同じArrayに格納するためにAnyObect型のアレーを用意します。
var objects:[AnyObject] = [ Circle(radius: 2.0), Country(area: 243_610), Animal(legs: 4) ]
見事!
でも、ちょっと不安になったのでインスタンスを格納してみました。
var smallCircle = Circle(radius: 1) var japan = Country(area: 377_900) var monkey = Animal(legs: 2) var concreteObjects:[AnyObject] = [ smallCircle, japan, monkey ]
問題なく格納できました。いやあ何でも保持できそうですね。
今日はここまで。
*1:2015年9月12日:間違っていたカ所を改訂