問題タブ [swift-protocols]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
980 参照

arrays - Protocol インスタンスの配列は、contains メソッドでは機能しません

メモの内容を構成するものを定義するために使用しているプロトコルがあります。メモにはさまざまな種類のコンテンツを含めることができるため、プロトコルが最適な方法のように思われました。

次に、そのプロトコルの実装があります

これは、2 つのオブジェクトの単純化された例です。次に、プロトコルの実装Noteを保持するクラスがあります。ArrayContent

私が抱えている問題は、私がそうするときです

コンパイラが教えてくれる

Note.swift:21:12: タイプ '([Content], Content)' の引数リストを受け入れる 'contains' のオーバーロードが見つかりません

私はStackoverflowでいくつかの例を見てきましたが、それらが示すようにやっています。プロトコルを配列および関連するグローバル関数として使用するためにプロトコルを定義する方法に問題はありますか?

編集

また、プロトコルを から継承しようとしましたが、Equatableその時点で次のコンパイラ エラーが発生します。

プロトコル 'Content' は、Self または関連する型の要件があるため、一般的な制約としてのみ使用できます

一連のプロトコルに対して等価性チェックを実行する方法について、少し混乱しています。それはSwiftがサポートしていないものですか?私は C# のバックグラウンドを持っているので、Swift がプロトコルを完全に処理する方法がわかりません。

0 投票する
2 に答える
1568 参照

protocols - Swiftでプロトコルのデフォルト実装を行うときにデフォルトプロパティを実装する正しい方法は何ですか?

私は Swift のプロトコル指向プログラミングの概念に本当に魅了されています。そのため、昨年作成した古いプロジェクト (元々は OOP フレームワークでした) を POP に移行しています。

この段階で私が抱えている問題は、私が POP を正しく理解していないか、真にプロトコル指向のフレームワークを作成するためのすべてが Swift 2.0 ベータ版にないためである可能性があります。 POP の特定の側面)。

プロトコル指向プログラミングは、世界に導入されてから 1 か月も経っていないまったく新しいプログラミング パラダイムであるため、それについて書かれたコンテンツはあまりありません (このトピックに関して私が見つけた唯一のチュートリアルは、私が抱えている問題に対処していません。 WWDC ビデオもそうではありませんでした)。

とにかく、要点: 私はここで何か間違ったことをしている、またはプロトコル指向プログラミングの欠点の 1 つは、多くのコードを繰り返さなければならないことです。適例:

多くのプロパティがあり、プロトコルにも準拠している次のプロトコルがありEquatableます。

私のフレームワークの元のバージョンでは、このプロトコルは と呼ばれるクラスMediaで、他の 2 つのクラスはそこから継承されていました。そのため、彼らはこれらすべてのプロパティを無料で取得しました。

しかし、そのプロトコルに準拠するオブジェクトに、それらのプロパティのデフォルトの実装 (つまり、ゲッター) を与えることができないように見えますか?

私が最初に試みたのは、単にプロトコルを構造体宣言に与えることでしたが、失敗しました。これは、プロパティの実装を提供していなかったため、予想されていました。

これは次の場合に失敗します。

タイプ「Anime」はプロトコル「MediaType」に準拠していません

私の次の試みは、MediaType の拡張機能を作成し、そこにプロパティをスローすることでした。

これはうまくいきませんでした:

拡張機能には、保存されたプロパティが含まれていない場合があります。

そして、私が本当に気に入らなかった欠点が 1 つあります。それは、プロトコルのプロパティを拡張機能にコピーすることによって、既にコードを複製していたことです。

そのため、結局、プロトコルに準拠するオブジェクトにプロパティを「分散」させることができなかったため、Anime構造体にプロパティを追加することになりました。

そして、これはうまくいくように見えました。しかし、今では と の両方に自分のプロパティがMediaTypeありAnimeます。OOP では、サブクラス化によってコードの重複を回避します。

だから私はここで私の質問を繰り返します:私はプロトコル指向プログラミングを誤解していますか、それとも構造体/クラス/列挙型を準拠させるたびにプロトコル固有のロジックをコピーして貼り付ける必要があるというPOPの欠点ですか?

0 投票する
1 に答える
328 参照

swift - Swift: ジェネリック型をクロージャーに制限する

ジェネリック型をクロージャーに制限するにはどうすればよいですか? このような:

0 投票する
2 に答える
790 参照

swift - where句を使用したSwift配列拡張がサブプロトコルで機能しない

Swift 2 (Xcode 7b4) で動作すると思われるコードをいくつか書きましたが、コンパイルされていませ。私がやろうとしていることが有効であるかどうかについて、いくつかの考えを得たいと思っています。

Array次の拡張例を検討してください。

まず、要素が である配列とはどういう意味AnyObjectですか? 基本的に、配列には、インスタンスの等価性 ( ) を比較できる非値型オブジェクトの異種グループを含める必要があると言っています===

例の関数appendUniqueInstance()は、要素がまだ配列にない場合にのみ、要素を配列に挿入します。これは操作に似ていますが、明らかに順序付けを提供し、(さらに重要なことに)の同種型要件をSet insert()課しません(の の使用による)。SetEquatableSelf

を実装するプロトコルPとクラスを定義すると、次のようになります。CP

をインスタンス化しますC:

let c = C()

次に、これらの非常に明白なことが真実です。

そして、次のことができるようになりました。

ここまでは順調ですが、問題のケースについては次のとおりです。

ここで、a2は の配列として型付けされているため、 のインスタンスPに対して行うことは完全に有効なはずであり、実際に行は期待どおりに機能します。appendPa2.append(c)

Arrayただし、拡張関数を呼び出すとappendUniqueInstance()、コンパイラ エラーが発生します。

私が知る限り、コンパイラは何に渡すことができるかについて混乱しているようappendUniqueInstance()で、C(via P) がAnyObject.

Pちなみに、代わりに次のように宣言すると:

@objc protocol P : AnyObject {}

その後、すべてが正常にコンパイルされますが、プロトコルのすべてが にP準拠していることも確認する必要があります@objc。これは私が望んでいるものではありません。

結局のところ、私の質問は次のとおりです。これはうまくいくように見えますか? 宣言の構文が間違っているだけではないことを願っていますが、そうであればうれしいと思います。

0 投票する
2 に答える
4519 参照

swift - デリゲートメソッドはSwiftで呼び出されませんか?

セグエの助けを借りずに、ビューコントローラーから別のビューコントローラーに Bool 値を渡したいです。だから私は紹介してデリゲートを獲得しました。

アプリにデリゲートを適用しました。しかし、Delegate メソッドは呼び出されていません。どこで間違いを犯しているのかわかりません。

だから私を助けてください。

MainViewController

2 番目のビュー コントローラー

0 投票する
3 に答える
14143 参照

swift - プロトコル内のネストされた型

次のように、ネストされた型をプロトコル内で宣言することができます。

Xcode には、「ここでは入力できません」と表示されます。

タイプ 'NameOfClass' は、プロトコル 'Nested' でネストできません

ネストされた型を持つ必要があるプロトコルを作成したいと考えています。これは不可能ですか、それとも別の方法でこれを行うことができますか?