今回は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
を使用することで型を抽象的に扱うことができるようになる」ということを覚えてもらえれば良いかと思います。
間違いや不備がありましたらコメントお願いします。
コメント