
今回はプロトコル(protocol)について書きたいと思います。
プロトコルの説明から実際の使用例までサンプルコードをもとにわかりやすく説明していきたいと思います。
クラスに対して、プロパティやメソッドを絶対に実行させる為の仕組みです。
プロトコルを使う場合はプロトコルを定義しますが、プロトコルには具体的な処理内容を書きません。
クラスと紐付けてクラスに処理内容を書いていきます。
これだけではピンとこないと思うのでコードを見ながら説明します。
import UIKit
let dt = Date()
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = DateFormatter.dateFormat(fromTemplate: "yMMMdHms", options: 0, locale: Locale(identifier: "ja_JP"))
print(dateFormatter.string(from: dt))
protocol timeCard {
var type: String { get } //出勤
var date: String { get set } //出勤時の日時
func push() //出力するメソッド
}
class Staff: timeCard {
let name: String
let type = "出勤"
var date = dateFormatter.string(from: dt)
init(_ name: String) {
self.name = name
}
func push() {
print("\(name) \(type) \(date)")
}
}
let mayugezio = Staff("まゆげじお")
mayugezio.push()
//結果
//まゆげじお 出勤
//2020年4月23日 11:13:04
今回はアルバイトが出勤した時のタイムカード的な実装をしたいと思います。
上記コードはプロトコルで実装済みのコードです。
わかりやすいようにプロトコルで実装する前のコードも下記に載せておきます。
下記コードはシンプルに「Staffクラス」があって「nameプロパティ」があって、一つだけインスタンスを作っておきました。
class Staff {
let name: String
init(_ name: String) {
self.name = name
}
}
let mayugezio = Staff("まゆげじお")
ではプロトコルの書き方について説明します。
下記コードを見てみましょう!(サンプルコードでは8行目〜12行目)
protocol timeCard {
var type: String { get } //出勤
var date: String { get set } //出勤時の日時
func push() //出力するメソッド
}
まずprotocolと書いて、protocolの名前を書きます。
この中にメソッドやプロパティを書いていきます。
このあたりまではクラスを作る時などと同じですね。
2行目と3行目はプロパティを宣言しています。
protocolの中のプロパティはvarで宣言します。
先ほども少し説明しましたが、プロトコルの中には具体的な処理を書きません。
なのでプロパティを初期化する必要もないのを覚えておきましょう。
プロトコルでプロパティを宣言する時の注意点は、そのプロパティが「読み取り専用」なのか「読み書き可能」なのかを書きます。
読み取り専用なら { get }
読み書き可能なら { get set }
と書くだけOKです!
次に4行目のメソッドですが、ここでも定義だけして実装部分はクラスに任せてしまいます。
今回プロトコルに書いた2つのプロパティと1つのメソッドは必ず実行すると言う事になります。
では「Staffクラス」に「timeCardプロトコル」を適合させてみます。
下記コードを見てみましょう(サンプルコードでは14行目〜24行目)
class Staff: timeCard {
let name: String
let type = "出勤"
var date = dateFormatter.string(from: dt)
init(_ name: String) {
self.name = name
}
func push() {
print("\(name) \(type) \(date)")
}
}
クラスにプロトコルを適合させるにはクラスの横に1行目のように
:プロトコル名
としてあげればOKです!
プロトコルを適合させた状態で少し待つとエラーが出ます。
これはプロトコルを適合したのに、プロトコルのプロパティやメソッドを実装してないからです。
「timeCardプロトコル」のプロパティとメソッドを実装すれば解決します。
では次に「timeCardプロトコル」のプロパティとメソッドを「Staffクラス」で実装していきます。
3行目の「typeプロパティ」は読みより専用なのでletにして、初期値を設定します。
今回は出勤としました。
4行目の「dateプロパティ」は読み書き可能なのでvarにして、今回はData型を使って、現在の日時を代入させています。
(サンプルコードの3行目〜6行目がDate型の設定をしてる部分になりますが、今回の主旨からずれるので詳しい説明は割愛します。)
8行目〜10行目で「pushメソッド」の処理を書いています。
今回はアルバイトの名前と出勤と日時を出力してます。
まず1行目でインスタンスを生成しています。
2行目で「pushメソッド」を呼び出しています。
結果を見れば意図した結果が出力されているのがわかると思います。
let mayugezio = Staff("まゆげじお")
mayugezio.push()
//結果
//まゆげじお 出勤
//2020年4月23日 11:13:04
今回はプロトコルについて書きました。
プロトコルについてはもっと色々と書く事があるのですが、とりあえずこちらが基本的な書き方になります。
ありがとうございました!
[…] 前回の[Swift入門#23]クラス(プロトコル編)と同じサンプルと使いました。前回は「Staffクラス」の中で「push()メソッド」の処理を書いていましたが、今回は「timeCardプロトコル」をエクステンションで拡張してそちらで「push()メソッド」の処理を書いています。上記コードで言うと15行目〜19行目でエクステンションしています。31行目の結果を見てみると、クラスに実装を書かなくても「push()メソッド」が使えたのがわかると思います。 […]