は時々チュートリアルで見られるこの典型的な例、など(even in Apple's code)考えてみましょうか?関数にプロトコルが追加されたら理解できますが、1つ以上の変数を持つプロトコルにとっては良いアプリケーションは何ですか?単にname
をそれぞれstruct
とclass
に追加するのはなぜですか?私は機能せずスウィフトプロトコルを持つことができます
答えて
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).")
}
出力します:
スティーブは人である
は、ここでの例です。
ミトンはペットです。
マイプライドと喜びは車です。
これはクラスとサブクラスの関係とはどのように区別されますか?なぜ誰かがどちらかを使うのだろうか? – brandonscript
@brandonscript時々、複数の型がいくつかの共有された機能を持つことは意味がありますが、クラスとサブクラスの関係には厳密に束縛されていないことがあります。たとえば、多くの型は 'CustomStringConvertible'(' description'プロパティを持ちます)ですが、それらのすべてが単一のクラスをサブクラス化するのは意味がありません。プロトコルを使うということは、まったく異なる種類のもの(機能の多くはサブクラス化の概念を持たない)間で機能を共有できることを意味します。構造体、列挙型、およびクラスはすべて同じプロトコルに準拠することができます。 –
これはより強力です。継承ははるかに制限的です。私の 'Car'をプロトコルを使わずに' Nameable'にしたい場合、 'AbstractNameable'という抽象クラスのサブクラスでなければなりません。しかしSwift(ほとんどの言語のように)は多重継承をサポートしていないので、私の 'Car'は' Vehicle'のサブクラスにはなりません。 – Alexander
基本的にはあなたのクラス/構造体が定義されたプロパティが含まれています約束を作ります。
構造体の場合、これはサブクラス化できないため、非常に重要です。
また、サブクラスにスーパークラスが1つしかないため、複数の親を持つPersonを作成することはできません。
私はサブクラス化し、それらを使用する主な目的超えるなぜ使用プロトコルについては、この記事を読むためにあなたをお勧めします:
http://alisoftware.github.io/swift/protocol/2015/11/08/mixins-over-inheritance/
答えの鍵は、単語プロトコルです。
プロトコルは、正式な状況で正しい手順とそれに従う手順を説明する規則のシステムです。オブジェクト(構造体、列挙型、クラス、...)はプロトコルに適合しなければならないとき状態、言っ
、あなたはそれを尊重するを義務づけあります。そうしないと、Xcodeはエラーを投げます。
したがって、主な機能の1つ(絶対に唯一のユーティリティではありません)は、属性や機能をさまざまなオブジェクトに含めることを忘れることができないということです。
これは、複数の開発者が同じコードで作業している場合、または単に気を散らす可能性のある人間の間違いを避けるために非常に役に立ちます。
このプロトコルのもう1つの大きな利点は、タイプとして使用できることです。
したがって、同じプロトコルを継承する構造体、列挙型、または異なるクラスは、すべて同じ型にトレースできます。
- 1. スウィフトプロトコルが機能しない
- 2. 私は `super`またはthisのいずれかを持つことができますが、両方を持つことはできません。
- 3. は、私がマットラボで、この時系列機能を持つC#
- 4. カーネルから呼び出すことができるデバイス上の機能を持つことができます
- 5. 私はif-elseのような機能を持つことができる方法はありますか?
- 6. 例外:オブジェクトをすることはできませんnilの私は、この機能を持っている
- 7. 私はasp.netアプリケーションのサブアプリケーションを持つことができます
- 8. 見つけることができません私は私のAPIコントローラの機能を宣言した
- 9. 私のカウント機能をPythonで動かすことができません
- 10. キュウリは機能ステップを見つけることができません
- 11. idbは機能を見つけることができません - 何かヒント?
- 12. スウィフトプロトコルは、ここでのUIViewController
- 13. クラスを機能させることができません
- 14. クラウド機能を持つES7の "インクルード"機能を無効にできません
- 15. try/catchを使わずに遅延を作る、または1つの機能でそれを持つこと
- 16. Node.jsが基本機能を見つけることができません
- 17. Angularsjsがサービス機能を見つけることができません
- 18. 一致する機能を見つけることができません
- 19. jqueryの - 私はこの機能を持って言うことができます変数の値を失う
- 20. 建設機能を持つことは適切ですか?
- 21. CodeIgniterのは、私はこのログイン機能を持つ
- 22. 機能でシンボルを見つけることができません。
- 23. 、機能「create_vocab_corpus」を見つけることができませんでした
- 24. エラー:機能を見つけることができませんでした「ImportMethodFrom」
- 25. 私は変更することはできません機能を持っているJavaScript関数
- 26. は、私はこの機能を持っているJS機能
- 27. デーモンプロセスは子供を持つことができません
- 28. は、私は次の例持つ機能
- 29. パスと私は別の機能を持つのparamsを渡すことに問題があることに
- 30. Flashを使用せずにこのFlashアプリケーションの機能を再作成することはできますか?
多型は非常に有用です。実際のタイプを知らなくてもオブジェクトを使用できます。 – Francescu
@Francescuあなたは精巧にできますか? – brandonscript