0
1

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 3 years have passed since last update.

protocolの基本と種類(swift)

Last updated at Posted at 2021-08-15

#protocolとは
直訳すると議定書・手順。

swiftでは、クラス・構造体などに対してプロパティとメソッドを定義する機能。
プロトコルを適用したクラス・構造体は、プロトコルに定義されているプロパティ・メソッドを必ず定義しなければならない。

つまり、「クラス作成のルールを定めて、それを守らせる」という認識であっているでしょうか🤔

#protocolを定義する

sample
protocol プロトコル名 {
    var プロパティ名 :  {set get}
    func メソッド名(引数名 : ) -> 戻り値の型
}

プロパティ名の横には{set get}もしくは{get}
を記入する。
{set get} 読み書き可能
{get} 読み込み専用

#代表的なプロトコルの種類

###CustomStringConvertible
インスタンスの文字表現を自由にカスタマイズできるプロトコル。

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
対象が一致するかどうか(イコール)の確認を可能にするプロトコル。

Equable
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
対象の大小を確認するためのプロトコル。

Equable
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などのデータをデコード、エンコードするプロトコル。

Codable
struct Person: Codable{
    let name = String
    let height = Int
    let weight = Int
}

これだけで、エンコード、デコードともに可能な状態になります。
インスタンス化後に、JsonDecoder/Encoder()などで変換します。

###Error
throw文のエラーを処理する型で必要なプロトコル。
Errorプロトコルは列挙型で定義するのが一般的である。
また、プログラム全体で起こりうるエラーを1つの列挙型で表すのではなく、エラーの種類ごとに別の型に定義する。

Codable
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

F560A0CB-D19D-44CC-A61A-0B5397C6FA58_4_5005_c.jpeg

#_
*本記事は初心者による作成です。細心の注意は払っていますが内容に誤りが含まれる場合がございます。
ご指摘いただけると幸いです。

0
1
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
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?