Swiftで遊ぼう! on Hatena

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

Swiftで遊ぼう! - 242 - Protocol Conformance

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日:間違っていたカ所を改訂