SwiftのプロトコルとJavaのインターフェイスを比較する


149

アップルの開発者ページからiOSのチュートリアルを行っています

私にはそれprotocolinterfaceほぼ同じ機能を持っているようです。

  • 2つの間に違いはありますか?

  • プロジェクトでの異なる使用法?

更新しました

はい、私は上記のリンクを読んでなかったし、私はまだわからどのような違いと使用の間にはないよprotocolinterface。このような質問をすると、そのトピックについて簡単な説明が欲しいのですが。ドキュメントからすべてを取得するのは難しい場合があります。


1
SwiftのプロトコルとJavaのインターフェースは同じ概念です。こちらをご覧ください
Vivek Molkar

69
言語間の違いについてのこのような質問は、言語の特徴を理解するのに非常に役立ちます。そして、それらが不必要な独断的な回答につながるとは思わないし、ドキュメンテーションでその回答を見つけるのも非常に簡単ではありません。したがって、この質問に対する反対票は正当化されないと思います。
Lii

1
ここでのカップルの重要な実世界でのポイント - Javaインターフェースについてstackoverflow.com/a/41143492/294884誰のためのキーになります- ジャワしようスウィフトと新鮮な、
Fattie

逆に言えば、Swiftの存在意義はすべて「プロトコル指向プログラミング」のためのものであることを思い出すのは不愉快なことです。Swiftの「プロトコル拡張機能」を使用すると、どこでもあらゆることを実行できます。たとえば、ここに Swiftに関する微妙な問題(つまり、「プロトコル拡張について」)があり、いくつかの問題が示されています。
Fattie

2
スウィフトに、代わりインターフェイスのCからのObjective Cヘッダファイル(無駄な重複)のインターフェイスと呼ばれているため、プロトコル名が使用されている
Alex78191

回答:


117

基本的に、プロトコルは、以下を除いてJavaインターフェースに非常に似ています。

  • Swiftプロトコルは、実装する必要があるプロパティ(つまり、フィールド)を指定することもできます
  • Swiftプロトコルは、変化するキーワードを使用して値/参照を処理する必要があります(構造体とクラスによってプロトコルを実装できるため)
  • protocol <>キーワードを使用して、いつでもプロトコルを組み合わせることができます。たとえば、プロトコルAおよびBに準拠する必要がある関数パラメーターを次のように宣言します。

func foo ( var1 : protocol<A, B> ){}

これらは、Java開発者(または少なくともこれまでに見つけたもの)にとってすぐにわかる違いです。


13
" protocol <>キーワード ":それは本当にクールです!これは、型システム理論のコミュニティでは、いわゆる交差型だと思います。Javaでは、複数の境界を持つ型パラメーターに対してのみそのような型を使用できます。このホワイトペーパーでは、Javaでそれらをファーストクラスタイプとして紹介し、それらを示す構文を示します。
Lii

7
いいまとめ。さらに重要な機能が2つあります。Swiftプロトコルでは、関連する型の要件を指定することもできます。たとえば、コレクション型には関連するインデックス型があり、比較可能な型の比較メソッドでは同じ型のパラメーターが必要です。また、Swift 2.0では、プロトコル拡張により、プロトコルの要件を満たすタイプに実際の機能を追加できます。
rickster

2
@rickster Java 8でも、メソッドにdefault キーワードをタグ付けすることにより、インターフェースに実装を追加できます。Oracleチュートリアルを参照してください。
バジルブルク2016年

5
アンパサンドに代わって、protocol <>キーワードが削除されました。だからあなたは書くことができます:let c:A&B
Paul Robinson

2
スウィフトに、代わりインターフェイスのCからのObjective Cヘッダファイル(無駄な重複)のインターフェイスと呼ばれているため、プロトコル名が使用されている
Alex78191

33

@Thomas Scharの回答を補足します。Swiftプロトコルの魔法は、拡張機能に由来しています。

  • Swiftプロトコルは、拡張機能(Swift
    2)を介して実装を取得できます。Java 8インターフェースはデフォルトの実装を持つことができますが、「遡及的に」実行することはできません。
  • Swiftでは、プロトコル要件(および
    必要に応じてその実装)を任意のクラスまたは構造に「遡及的に」追加できます。
  • Swiftプロトコルは、一般的な(つまり<..>)カスタマイズパターンではなく、typealiasスキーム(つまり、関連する型)に従います。最初は混乱するかもしれませんが、
    場合によっては「山かっこ盲目」を回避できます。
  • Swiftには高度なタイプパターンマッチングがあり、プロトコルの要件と拡張機能が適用される場所と方法を非常に具体的に指定できます。Javaから来ると混乱するかもしれませんが、それは多くの力を持っています。
  • 迅速なプロトコルは、プロパティ/パラメーター(つまり、祝賀:プロトコル)で構成できます。

数時間頭を悩ませたのは、すべてのプロトコルをプロパティタイプとして使用できるわけではないということです。たとえば、typealiasのプロトコルがある場合、それをプロパティのタイプとして直接使用することはできません(考えてみると理にかなっていますが、JavaからはuserDao:IDaoのようなプロパティが必要です)。


7
また、Javaインターフェイスとは異なり、Swiftプロトコルにはオプションのメンバーを含めることができます。
eyeApps LLC 2016

4
Swiftで常に浮かび上がるマイナーな点は、(途方もなく)抽象関数がないため、「これを忘れてしまったことを印刷する!」... stackoverflow.com/a/24111430/294884
Fattie

@Fattie。関数で「必須」キーワードを使用して、サブクラスの実装が必要であることを指定できます。ですから、実際には、実際のポイントというより、マイナーな無知のようです。
Dirk Bester

@DirkBester-乾杯-待って、あなたは初期化子と話しているのですか?
Fattie

繰り返しますが@DirkBester混乱するかもしれませんrequiredが、プロトコルの関数の前に使用することはできません。あなたはただ得るだけ'required' may only be used on 'init' declarationsです
Fattie
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.