2016-08-25 10 views
2

は時々チュートリアルで見られるこの典型的な例、など(even in Apple's code)考えてみましょうか?関数にプロトコルが追加されたら理解できますが、1つ以上の変数を持つプロトコルにとっては良いアプリケーションは何ですか?単にnameをそれぞれstructclassに追加するのはなぜですか?私は機能せずスウィフトプロトコルを持つことができます

+0

多型は非常に有用です。実際のタイプを知らなくてもオブジェクトを使用できます。 – Francescu

+0

@Francescuあなたは精巧にできますか? – brandonscript

答えて

6

Personの名前だけではありません。ペットには名前がついていて、道路には名前があります。

各オブジェクトに異なるオブジェクトのコレクションの名前を付ける場合はどうすればよいですか?それらのオブジェクトをAnyのコレクションに格納すると、すべてのオブジェクトに名前があることを保証する方法がありません。

これはプロトコルが入る場所です。Nameableプロトコルを作成することで、Nameableオブジェクトのコレクションを作成でき、その中のすべてのオブジェクトの名前が保証されていることを確認してください。

protocol Nameable { 
    var name: String {get} 
} 

struct Person : Nameable { 
    let name: String 
    let age: Int 
    // other properties of a Person 
} 

struct Pet : Nameable { 
    let name: String 
    let species: String 
    // other properties of a Pet 
} 

struct Car : Nameable { 
    let name: String 
    let horsepower: Double 
    // other properties of a Car 
} 

let namableItems: [Nameable] = [ 
    Person(name: "Steve", age: 21), 
    Pet(name: "Mittens", species: "Cat"), 
    Car(name: "My Pride and Joy", horsepower: 9000) 
] 

for nameableItem in namableItems { 
    print("\(nameableItem.name) is a \(nameableItem.dynamicType).") 
} 

出力します:

スティーブは人である

は、ここでの例です。

ミトンはペットです。

マイプライドと喜びは車です。

You can try it here.

+0

これはクラスとサブクラスの関係とはどのように区別されますか?なぜ誰かがどちらかを使うのだろうか? – brandonscript

+2

@brandonscript時々、複数の型がいくつかの共有された機能を持つことは意味がありますが、クラスとサブクラスの関係には厳密に束縛されていないことがあります。たとえば、多くの型は 'CustomStringConvertible'(' description'プロパティを持ちます)ですが、それらのすべてが単一のクラスをサブクラス化するのは意味がありません。プロトコルを使うということは、まったく異なる種類のもの(機能の多くはサブクラス化の概念を持たない)間で機能を共有できることを意味します。構造体、列挙型、およびクラスはすべて同じプロトコルに準拠することができます。 –

+2

これはより強力です。継承ははるかに制限的です。私の 'Car'をプロトコルを使わずに' Nameable'にしたい場合、 'AbstractNameable'という抽象クラスのサブクラスでなければなりません。しかしSwift(ほとんどの言語のように)は多重継承をサポートしていないので、私の 'Car'は' Vehicle'のサブクラスにはなりません。 – Alexander

1

基本的にはあなたのクラス/構造体が定義されたプロパティが含まれています約束を作ります。

構造体の場合、これはサブクラス化できないため、非常に重要です。

また、サブクラスにスーパークラスが1つしかないため、複数の親を持つPersonを作成することはできません。

私はサブクラス化し、それらを使用する主な目的超えるなぜ使用プロトコルについては、この記事を読むためにあなたをお勧めします:

http://alisoftware.github.io/swift/protocol/2015/11/08/mixins-over-inheritance/

1

答えの鍵は、単語プロトコルです。

プロトコルは、正式な状況で正しい手順とそれに従う手順を説明する規則のシステムです。オブジェクト(構造体、列挙型、クラス、...)はプロトコルに適合しなければならないとき状態、言っ

、あなたはそれを尊重するを義務づけあります。そうしないと、Xcodeはエラーを投げます。

したがって、主な機能の1つ(絶対に唯一のユーティリティではありません)は、属性や機能をさまざまなオブジェクトに含めることを忘れることができないということです。

これは、複数の開発者が同じコードで作業している場合、または単に気を散らす可能性のある人間の間違いを避けるために非常に役に立ちます。

このプロトコルのもう1つの大きな利点は、タイプとして使用できることです。

したがって、同じプロトコルを継承する構造体、列挙型、または異なるクラスは、すべて同じ型にトレースできます。

関連する問題