3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

共通の項目はprotocolで制約を付ける の手順

Last updated at Posted at 2019-01-03

はじめに

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歳の雑種犬です。

参考

Swift では Protocol を積極的に使おう

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?