はじめに
ラクスエンジニアのstrongWhiteです。今回はSwiftのextensionとprotocolについて書きます。
私がSwiftを勉強し始めたころは、この2つの概念がよくわかっていませんでした。
2つとも似ているようで全く違うので、両者について簡単にまとめてみます。
extensionとは
extension(拡張)とは、特定のクラスや構造体、データ型など、名前はそのままにプロパティやメソッドを追加する機能です。
Javaでいうと「継承」と似ています。Javaの「継承」はクラスのプロパティやメソッドを引き継いだ別名のクラスを作るのに対し、Swiftの「拡張」は名前はそのままになるのが特徴です。
extensionの使い方
それではextensionを使った簡単なプログラムを書いてみましょう。今回はデータ型
の拡張を行ってみます。
extensionを使って、Swiftに標準で備わっているデータ型(例.Int、String)を拡張してみます。
extension String { func isLongString() -> Bool { if self.count <= 20 { return false } return true } } let text = "RAKUS Developers Blog" print(text.isLongString()) // 実行結果:true
サンプルプログラムでは、String型を拡張し、文字数が20文字以上かどうかを判別する簡単な関数を定義しています。
このように、extensionを使えば、変数の値の比較や加工処理を、既存のデータ型にメソッドを追加することで実現できます。
私は今まで「データ型の定義を拡張できる」ような言語に出会ったことがなかったので、この辺りはとても新鮮な感覚でした。
protocolとは
お次はprotocolです。protocolとは、クラスの挙動や振る舞いを決めたものです。クラスでは、プロパティや挙動を細かく記述していきますが、protocolでは、インタフェースのみを定義します。実際の挙動はprotocolを採用するクラス側で記述します。
protocolの使い方
ではprotocolを使った簡単なプログラムを書いてみます。今回は列挙型
にprotocolを適用してみます。
protocol BaseProtocol { var type: String { get } } enum Blood: BaseProtocol { case AB case A case B case O var type: String { switch self { case .AB: return "AB型" case .A: return "A型" case .B: return "B型" case .O: return "O型" } } } print("あなたの血液型は" + Blood.AB.type + "です") // 実行結果:あなたの血液型はAB型です
サンプルプログラムでは、血液型を列挙型で定義してみました。また、ベースとなるprotocolとして、BaseProtocol
(そのままですが)を採用しています。
また、列挙型のほうで、BaseProtocol
に定義してあるtype
変数を宣言しないとコンパイルエラーになります。
最後に
Swiftのextensionとprotocolについて、違いがよくわかっていなかったので勉強してみました。
それぞれ身近なJavaを例に挙げて、extension→継承、protocol→インタフェースであると解説しましたが、Swiftを知らない人でも少しはイメージができたのではないでしょうか。
皆さんもこの辺りを勉強してみるとよりSwiftが面白いと感じるかと思います。
エンジニア中途採用サイト
ラクスでは、エンジニア・デザイナーの中途採用を積極的に行っております!
ご興味ありましたら是非ご確認をお願いします。
https://career-recruit.rakus.co.jp/career_engineer/カジュアル面談お申込みフォーム
どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。
以下フォームよりお申込みください。
forms.gleイベント情報
会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください! rakus.connpass.com