問題タブ [protocol-extension]

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 投票する
3 に答える
741 参照

swift - Swift プロトコル拡張 `var { get }` オーバーライド実装の `let`

と を使用したプロパティの実装は、実装する構造体が as 型の変数に割り当てられている場合、動作が異なりvarます。letprotocol

これは Swift の設計された動作ですか?

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

swift - プロトコル拡張を使用したデフォルトの associatedType

のプロトコルがありassociatedTypeます。typealiasプロトコル拡張でそのタイプのデフォルトを指定したいと思います。これは、特定のクラスから継承するクラスに対してのみ行われます。

プロトコル拡張:

コンパイラはそれを不平を言い'Bar' is ambiguous for type lookup in this contextます。私も迅速な本で役立つものを見つけることができませんでした。

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

ios - 確認型を返すプロトコル拡張を作成する方法は?

NSData を引数として取る関数を持つプロトコル拡張 JsonProcess を実装しようとしていますが、このような自己要件を使用してさまざまなプロトコル拡張を作成したいと考えています

しかし、コンパイラはエラーを表示します

タイプ 'Login' の戻り式を戻りタイプ 'Self' に変換できません

Login クラスは次のように定義されます

NSData をシリアル化し、Login クラスのインスタンスを作成して入力し、返そうとした場合、ここで何を返す必要がありますか?

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

swift - スーパークラスとサブクラスを使用した Swift プロトコル拡張 static-methods ディスパッチ

Swift protocol extension method dispatch with superclass and subclass で説明されている同様の、しかしわずかに異なる問題があります。

この問題は、プロトコルの静的メソッドに関連しています。

次のコードがあります。

プロトコル プロトコルから reuseID 宣言を削除すると、動作は「修正」されます。これは後退していませんか?https://nomothetis.svbtle.com/the-ghost-of-swift-bugs-futureによると 、プロトコル拡張のディスパッチのルールは次のとおりです。

  1. 推定された変数の型がプロトコルの場合:
  2. AND メソッドが元のプロトコルで定義されている場合、拡張にデフォルトの実装があるかどうかに関係なく、ランタイム タイプの実装が呼び出されます。
  3. AND メソッドが元のプロトコルで定義されていない場合、デフォルトの実装が呼び出されます。
  4. ELSE IF 推論された変数の型がその型である THEN 型の実装が呼び出されます。

私が観察している行動は正反対です。私が間違っていることは何ですか?

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

ios - Protocol extension methods don't get called when protocol extends existing Apple API protocol

I want a protocol to inherit from an Apple protocol UIViewControllerTransitioningDelegate, add additional protocol requirements and provide a default implementation for some methods in that protocol. When I do that, the methods do not get called. When I implement the methods in the class itself, the methods do get called.

Here's what I'm talking about:

If I add the following code the functions do get called.

These methods I'm trying to provide a default implementation for are optional methods.

0 投票する
0 に答える
106 参照

ios - Swift プロトコル拡張: UIViewController の #selector の追加

迅速なプロトコル拡張を介して UITapGestureRecognizer を UIViewController に追加しようとしています。#selector で tapGestureRecognizer を初期化しようとすると、問題が発生します。私は遊び場で以下をセットアップしました

上記のシナリオでは、「#selector の引数は、Objective-C に公開されていないメソッドを参照しています」というメッセージとともにコンパイラ エラーが発生します。

@objcプロトコル宣言の先頭にieを追加すると、コンパイラ エラーを修正できます。

ただし、を追加する@objcと、UIViewController で「タイプ SomeViewController がプロトコル 'Tapable' に準拠していません」というコンパイラ エラーが発生します。また、「候補は @objc ではありませんが、プロトコルにはそれが必要です」という修正も提案されています。

この Fix-it をタップすると、setupTapGestureRecognizer の先頭に @objc が追加されます (つまり@objc func setupTapGestureRecognizerInView(view: UIView) {、これではコンパイラ エラーは解決されず、Fix-it が追加したばかりの @objc を削除するように指示する 2 番目のコンパイラ エラーも発生します)。

UIViewController のプロトコル拡張を介して #selector を追加するにはどうすればよいですか?

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

swift - 「Protocol … can only be used as a generic constraint because it has Self or associated type requirements」というエラーが表示されるのはなぜですか?

Int以下のように拡張機能を書きました。

上記のコードは機能します。IntegerTypeここで、Int、UInt、Int64 などがすべて準拠するようにプロトコルを拡張したいと考えています。私のコードは以下の通りです。

エラーが発生します:

プロトコル 'IntegerType' は、自己型または関連付けられた型の要件があるため、一般的な制約としてのみ使用できます

私はすでにこの質問とそのビデオとこの質問を見ましたが、まだ理解できませんでした. associatedTypeこの場合はあるSelfが、点をつなぐことができなかったものがあることだけを理解しました。自分の知識不足Genericsも一因のような気もしますが…

誰かがこの件について少し詳しく説明できますか?なぜ拡張機能がエラーを作成するのですか?

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

swift - クラスは、デフォルトの実装を含む拡張子を持つプロトコルに準拠していません

私は現在、Treehouse IOS Swift コースに取り組んでおり、天気アプリを構築しています。クラスがプロトコルに準拠していないというエラーが何度も発生するところまで来ましたが、その理由がわかりません。

これが私のプロトコル宣言です:

次に、プロトコルで宣言された 2 つのメソッドのデフォルトの実装を持つプロトコル拡張があり、以下に示すように、メソッドの 1 つが他のメソッドを呼び出しています。

次に、不適合エラーが発生しているクラス宣言があります。

ここで何が起こっているのかを把握するために、数時間にわたって多くの読み物をしました。私が理解していることから、プロトコル拡張にデフォルトの実装があるため、クラスでこれら 2 つのメソッドを定義する必要はありません。私はパブリック/内部タイプの問題に出くわしましたが、他の誰かがここ StackExchange で拡張機能を使用していました (パブリックとそうでないもののラベル付けでわかるように) が、それは役に立たなかったようです私の場合。エラーを解消する唯一の方法は、元のプロトコル宣言でこれらのメソッド宣言をコメントアウトすることです。これは、クラス、プロトコル、または何かが何らかの理由で拡張機能を認識していないことを示しているようですが、コマンドをクリックするとfetchクラス宣言でメソッド呼び出しを行うと、拡張でその定義に移動します。私は解決策を見つけることができませんでした、またはこれと同じようなことをしている人でさえ、同じ問題を抱えているように見える Treehouse に何人かの人々がいます.

また、教師のコードをダウンロードして Swift 3 に変換しましたが、同じエラーが発生していたので、彼がビデオを作成したときに使用したものとは異なるバージョンの Xcode を使用していることに問題があるのでしょうか?

少しストローをつかんでいるような気がしますが、これを理解したいと思っているので、可能な限り助けていただければ幸いです。

ありがとうございました!

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

swift - Swift 3 混合プロトコル、拡張機能、およびクラス継承で発生する可能性のあるバグ

私は、swift、OOP、および POP についてすべて学んでいます。予期しない動作に遭遇したとき、それらを混ぜ合わせて抽象基本クラスを作成していました。これはコードで表現するのが最適です。期待どおりに動作することを示し、次に予想外の動作を示します (少なくとも私には)。コードは長いですが、単純です。ここでは正常に動作しています:

出力は次のとおりです。

これはまさに私が疑うとおりです。しかし、次のように、最初のクラスに conforms() のカスタム実装がなかったときに、アプリでこの問題に遭遇しました。

ここで、TheUniverse には conforms() のカスタム実装がないことに注意してください。出力は次のとおりです。

最初の 3 つの print() 行はまさに私が期待し、望んでいるものですが、最後の 3 行は本当に困惑します。conforms() はプロトコル要件であるため、上の 3 行と同じでなければなりません。しかし、conforms() がプロトコル拡張に実装されているが、プロトコル要件としてリストされていないかのように動作します。これについては、The Swift Programming Language リファレンス マニュアルには何もありません。この WWDC のビデオはちょうど 30:40 で、私の主張を証明しています。

それで、私は何か間違ったことをしたのですか、機能を誤解したのですか、それとも Swift 3 でバグを見つけましたか?