#protocolとは
直訳すると議定書・手順。
swiftでは、クラス・構造体などに対してプロパティとメソッドを定義する機能。
プロトコルを適用したクラス・構造体は、プロトコルに定義されているプロパティ・メソッドを必ず定義しなければならない。
つまり、「クラス作成のルールを定めて、それを守らせる」という認識であっているでしょうか🤔
#protocolを定義する
protocol プロトコル名 {
var プロパティ名 : 型 {set get}
func メソッド名(引数名 : 型) -> 戻り値の型
}
プロパティ名の横には{set get}もしくは{get}
を記入する。
{set get}
読み書き可能
{get}
読み込み専用
#代表的なプロトコルの種類
###CustomStringConvertible
インスタンスの文字表現を自由にカスタマイズできるプロトコル。
class Shoe: CustomStringConvertible {
let color: String
let size: Int
let hasLaces: Bool
init(color: String, size: Int, hasLaces: Bool) {
self.color = color
self.size = size
self.hasLaces = hasLaces
}
//ここでインスタンスの文字表現をカスタマイズする
var description: String {
return "Shoe(color: \(color), size: \(size), hasLaces: \
(hasLaces))"
}
}
let myShoe = Shoe(color: "Black", size: 12, hasLaces: true)
let yourShoe = Shoe(color: "Red", size: 8, hasLaces: false)
print(myShoe)
print(yourShoe)
Shoe(color: Black, size: 12, hasLaces: true)
Shoe(color: Red, size: 8, hasLaces: false)
もしCustomStringConvertibleを使わずに、descriptionも定義しないで出力すると
Shoe
Shoe
###Equatable
対象が一致するかどうか(イコール)の確認を可能にするプロトコル。
struct Person: Equatable{
var name: String
var age: Int
//年齢が同じかどうかをBoolで返すメソッド
static func == (lhs: Person, rhs: Person) -> Bool{
return (lhs.age == rhs.age)
}
}
//インスタンス化
let yamada = Person(name: "YAMADA", age: 20)
let Takahashi = Person(name: "TAKAHASHI", age: 30)
//年齢が同じかどうかの確認が可能になる!
yamada == takahashi //false
###Comparable
対象の大小を確認するためのプロトコル。
struct Person: Equatable: Comparable{
var name: String
var age: Int
//年齢が同じかどうかをBoolで返すメソッド
static func == (lhs: Person, rhs: Person) -> Bool{
return (lhs.age == rhs.age)
}
//年齢が小さいかどうかをBoolで返すメソッド
static func < (lhs: Person, rhs: Person) -> Bool{
return (lhs.age < rhs.age)
}
}
//インスタンス化
let yamada = Person(name: "YAMADA", age: 20)
let Takahashi = Person(name: "TAKAHASHI", age: 30)
//年齢の比較が可能になる!
yamada < takahashi //true
###Codable
jsonなどのデータをデコード、エンコードするプロトコル。
struct Person: Codable{
let name = String
let height = Int
let weight = Int
}
これだけで、エンコード、デコードともに可能な状態になります。
インスタンス化後に、JsonDecoder/Encoder()などで変換します。
###Error
throw文のエラーを処理する型で必要なプロトコル。
Errorプロトコルは列挙型で定義するのが一般的である。
また、プログラム全体で起こりうるエラーを1つの列挙型で表すのではなく、エラーの種類ごとに別の型に定義する。
enum DatabaseError: Error{
case entryNotFound
case duplicatedEntry
case invalidEntry(reason: String)
}
enum NetworkError: Error{
case timeout
case cancelled
}
#参考文献
・swift実践入門
・App Development With Swift - Unit4 Lesson4.1
#_
*本記事は初心者による作成です。細心の注意は払っていますが内容に誤りが含まれる場合がございます。
ご指摘いただけると幸いです。