問題タブ [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.
arrays - Protocol インスタンスの配列は、contains メソッドでは機能しません
メモの内容を構成するものを定義するために使用しているプロトコルがあります。メモにはさまざまな種類のコンテンツを含めることができるため、プロトコルが最適な方法のように思われました。
次に、そのプロトコルの実装があります
これは、2 つのオブジェクトの単純化された例です。次に、プロトコルの実装Note
を保持するクラスがあります。Array
Content
私が抱えている問題は、私がそうするときです
コンパイラが教えてくれる
Note.swift:21:12: タイプ '([Content], Content)' の引数リストを受け入れる 'contains' のオーバーロードが見つかりません
私はStackoverflowでいくつかの例を見てきましたが、それらが示すようにやっています。プロトコルを配列および関連するグローバル関数として使用するためにプロトコルを定義する方法に問題はありますか?
編集
また、プロトコルを から継承しようとしましたが、Equatable
その時点で次のコンパイラ エラーが発生します。
プロトコル 'Content' は、Self または関連する型の要件があるため、一般的な制約としてのみ使用できます
一連のプロトコルに対して等価性チェックを実行する方法について、少し混乱しています。それはSwiftがサポートしていないものですか?私は C# のバックグラウンドを持っているので、Swift がプロトコルを完全に処理する方法がわかりません。
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の欠点ですか?
swift - Swift: ジェネリック型をクロージャーに制限する
ジェネリック型をクロージャーに制限するにはどうすればよいですか? このような:
swift - where句を使用したSwift配列拡張がサブプロトコルで機能しない
Swift 2 (Xcode 7b4) で動作すると思われるコードをいくつか書きましたが、コンパイルされていません。私がやろうとしていることが有効であるかどうかについて、いくつかの考えを得たいと思っています。
Array
次の拡張例を検討してください。
まず、要素が である配列とはどういう意味AnyObject
ですか? 基本的に、配列には、インスタンスの等価性 ( ) を比較できる非値型オブジェクトの異種グループを含める必要があると言っています===
。
例の関数appendUniqueInstance()
は、要素がまだ配列にない場合にのみ、要素を配列に挿入します。これは操作に似ていますが、明らかに順序付けを提供し、(さらに重要なことに)の同種型要件をSet
insert()
課しません(の の使用による)。Set
Equatable
Self
を実装するプロトコルP
とクラスを定義すると、次のようになります。C
P
をインスタンス化しますC
:
let c = C()
次に、これらの非常に明白なことが真実です。
そして、次のことができるようになりました。
ここまでは順調ですが、問題のケースについては次のとおりです。
ここで、a2
は の配列として型付けされているため、 のインスタンスP
に対して行うことは完全に有効なはずであり、実際に行は期待どおりに機能します。append
P
a2.append(c)
Array
ただし、拡張関数を呼び出すとappendUniqueInstance()
、コンパイラ エラーが発生します。
私が知る限り、コンパイラは何に渡すことができるかについて混乱しているようappendUniqueInstance()
で、C
(via P
) がAnyObject
.
P
ちなみに、代わりに次のように宣言すると:
@objc protocol P : AnyObject {}
その後、すべてが正常にコンパイルされますが、プロトコルのすべてが にP
準拠していることも確認する必要があります@objc
。これは私が望んでいるものではありません。
結局のところ、私の質問は次のとおりです。これはうまくいくように見えますか? 宣言の構文が間違っているだけではないことを願っていますが、そうであればうれしいと思います。
swift - デリゲートメソッドはSwiftで呼び出されませんか?
セグエの助けを借りずに、ビューコントローラーから別のビューコントローラーに Bool 値を渡したいです。だから私は紹介してデリゲートを獲得しました。
アプリにデリゲートを適用しました。しかし、Delegate メソッドは呼び出されていません。どこで間違いを犯しているのかわかりません。
だから私を助けてください。
MainViewController
2 番目のビュー コントローラー
swift - プロトコル内のネストされた型
次のように、ネストされた型をプロトコル内で宣言することができます。
Xcode には、「ここでは入力できません」と表示されます。
タイプ 'NameOfClass' は、プロトコル 'Nested' でネストできません
ネストされた型を持つ必要があるプロトコルを作成したいと考えています。これは不可能ですか、それとも別の方法でこれを行うことができますか?