はじめに
1.共通するものを見つける
2.protocol内に共通部分を書き出す
3.制約を与える
のポイントを押さえます。
「家族が自己紹介する」のテンプレートを作る
1.🙋♂️ < 父です。50才です。
2.💁♀️ < 母です。48才です。
3.🐕 < ペットです。1才の雑種犬です。
##1. 共通するものを見つける
自己紹介文に共通するワードとして下の2点を見つけました。
また、各自に喋ってもらうので「話す」という共通点もあります。
- 続柄
relationship
- 年齢
age
- 話す
func speak()
##2. protocol内に共通部分を書き出す
Family という名前のprotocolの中に、全員の共通部分を書き出します。
protocol Family {
var relationship: String { get }
var age: Int { get }
func speak() -> String
}
##3. 制約を与える
Person
作成
父と母は人なので Personという名前で構造体を作成します。
struct Person: Family {
}
}
作成したprotocol Family
の内容が必ず守られるよう、構造体名のあとに: Family
を付けます。
が、すぐに下記のエラーが出ます。
Type 'Person' does not conform to protocol 'Family' Do you want to add protocol stubs? [Fix]
Familyで書き出した共通部分の宣言がないためです。エラーのFixボタンを押すとXcodeが足りない宣言を補完してくれます。
補完して、func speak()
に定型文を入れます。
struct Person: Family {
var relationship: String
var age: Int
func speak() -> String {
return "\(relationship)です。\(age)歳です。"
}
}
Pet
作成
Person
と同じ流れでペット用のPet
という構造体を作成します。
struct Pet: Family {
var relationship
var age: Int
var kind: String // 犬 or 猫 or うさぎ …
func speak() -> String {
return “\(relationship)です。\(age)歳の\(kind)です。”
}
}
Person
と違う点は、
何の動物かわかるようにkind
という項目を増やしたことです。
各自に喋らせる
print("🙋♂️\(Person(relationship: "父", age: 50).speak())")
print("💁♀️\(Person(relationship: "母", age: 48).speak())")
print("🐕\(Pet(relationship: "ペット", age: 1, kind: "雑種犬").speak())")
// 🙋♂️父です。50歳です。
// 💁♀️母です。48歳です。
// 🐕ペットです。1歳の雑種犬です。