【Swift5.1】someってなに?簡単に説明

Swift

今回はSwiftUIを使っているとよく出てくる”some”というキーワードがどのような働きをしているのか、Opaque Result Typeに関する説明も交えながら解説していきます。

環境

  • Xcode12.5.1
  • Swift5.1

someとは?

someとは、Swift5.1から追加されたOpaque Result Typesのプロトコルに準拠した型であることを表す構文です。
Opaque Result Typesに準拠することで、内部実装を隠蔽しながらパフォーマンスにも影響させずに返り値の型を抽象化することができます。

someの使い方

SwiftUIを使用していると必ずsomeは目にしますよね。出現場所の8〜9割は以下のようなところではないでしょうか?

struct ContentView: View {
    var body: some View {
        Text("Hello, World!")
    }
}

つまりこれはViewプロトコルに準拠した抽象化された型を返すということになります。

他の例を出してみましょう。Animalというプロトコルと、Animalに準拠したDog型とCat型があるとし、それぞれの鳴き声をprintで表示させたいとします。

protocol Animal {
    func sound()
}

struct Dog: Animal {
    func sound() {
        print("bow wow")
    }
}

struct Cat: Animal {
    func sound() {
        print("meow")
    }
}

var pet1: some Animal {
    Dog()
}
pet1.sound() // "bow wow"とプリントされる

var pet2: some Animal {
    Cat()
}
pet2.sound() // "meow"とプリントされる

このようにpet1とpet2が返す型をsome AnimalとすることでDog型なのかCat型なのかを意識せずに処理を行うことができます。

なおかつ、以下のようにAnimalに準拠した型ならなんでも格納できるようにするよりも、使用するメモリー等パフォーマンス上のロスが少なくなります。(この程度のプロトコルや型なら大きな差はありませんが。)

var pet1: Animal {
    Dog()
}
pet1.sound() // "bow wow"とプリントされる

var pet2: Animal {
    Cat()
}
pet2.sound() // "meow"とプリントされる

まとめ

駆け足になりましたが、「someを使用することで型を抽象的に扱うことができるようになる」ということを覚えてもらえれば良いかと思います。

間違いや不備がありましたらコメントお願いします。

コメント