問題タブ [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.
swift - Swift プロトコル拡張の「関連付けられた型」を理解するのが難しい
プロトコルとプロトコル拡張を迅速に理解するのに苦労しています。
クラスに適用できる一連のプロトコルと、デフォルトの実装を提供する一連のプロトコル拡張を定義したいと考えています。コード例:
rawValue()
拡張機能の上記のオーバーライド関数はエラーを返しますAmbiguous type name 'ResultType' in 'Self'
。Self
からを削除するとSelf.ResultType
、エラーが発生します'ResultType' is ambiguous for type lookup in this context
。
どのタイプを使用するかをプロトコル拡張に通知するにはどうすればよいResultType
ですか?
私の目的は、次のようにプロトコルとその拡張機能をクラスに適用できるようにすることです。
となることによって:
デフォルトの実装を提供するためにプロトコル拡張がどのように機能するかについて、私が完全にベースから外れている場合、私は同じ結果を達成する方法についてオープンなアイデアを持っています。
swift - 実装されたプロトコルの静的メソッドをどのように区別しますか?
インスタンス関数の場合、キャストは問題なく機能します。
swift - プロトコルがそれ自体に準拠していませんか?
この Swift コードがコンパイルされないのはなぜですか?
コンパイラは、「型P
がプロトコルに準拠していませんP
」(または、Swift の以降のバージョンでは、「プロトコル 'P' に準拠する具象型として 'P' を使用することはサポートされていません。」) と言います。
なぜだめですか?どういうわけか、これは言語の穴のように感じます。この問題は、配列をプロトコル タイプarr
の配列として宣言することに起因していることに気付きましたが、それは不合理なことでしょうか? プロトコルは、構造体に型階層のようなものを提供するのに役立つと思っていましたか?
ios - 他のプロトコルによって制限されているジェネリック型でプロトコル メソッドを呼び出すことはできません
私は次のものを持っています:
Guard
異なるクラス タイプの任意の数のオブジェクト、および他のオブジェクトにプロトコルを割り当てたいと考えていPrisoner
ます。ガードとして機能するオブジェクトは、クラス タイプに応じて、独自のスマック実装を持ちます。smackAll
しかし、継承する可能性のある各クラスを書き直す理由はありませんGuard
。だから私はこのようにしようとしていますが、コンパイラは私を許しません。私は何が欠けていますか?
swift - 適合型のプロトコル拡張の実装に失敗しました
(必要に応じて質問のタイトルを自由に変更してください)
私は多くの BLE データを扱っており、デバッグの目的でUInt8
、HEX
計算された変数で簡単に拡張できることがわかりました。
小文字のバリアントが必要であることに気付きました。そして、私はそれが欲しかったのUInt32
ですUInt16
。変更されるのは印刷する桁数だけなので、ある種のプロトコルでこれを行うことができると思いました (少なくとも教育目的では)。
HEX
次に、これを利用してandhex
メソッドのデフォルトの実装を提供したい部分です。
コンパイラ エラーが発生しますArgument type 'Self' does not conform to expected type 'CVarArgType'
。
私はこれを理解していると思います。CVarArgType
プロトコルとして、そのような文字列初期化子で使用できる型 ( ) を採用する型になることを保証できないと言っています。where
それで初めて節を使えると思った。プロトコル拡張を次のように変更しました。
これはにつながりSame-type requirement makes generic parameter 'Self' non-generic
ます。その時点で私のアマチュアタイプの理論家の理解があふれました。異なる UInt サイズで 2 つの拡張メソッドを機能させる魔法は何ですか?
swift - コールバック型を Swift プロトコルでラップする
私が制御していないライブラリを扱っていて、コールバック型を定義するクラスをラップして、テスト目的でコードを分離しようとしているとしましょう。module 内のクラスは次のAXSwift
とおりです。
テスト用のラッパー プロトコルは次のとおりです。
タイプ 'Application'がプロトコル 'ApplicationProtocol' に準拠していません。UIElementProtocol
ApplicationProtocol コールバック内を に戻すと、UIElement
機能します。しかし、にUIElement
準拠してUIElementProtocol
いるのに、なぜこれが機能しないのですか?
2 番目の質問: ライブラリ API を設計して、この種のことを可能にするより良い方法はありますか?
swift - プロトコルの Swift プロトコル プロパティ - 候補の型が一致しません
2 番目のプロトコル (ProtocolB) に準拠する単一のプロパティを含むプロトコル (ProtocolA) があります。
それらを実装する2つのクラスを宣言しようとしています:
しかし、私はエラーが発生します:
タイプ「ClassA」はプロトコル「ProtocolA」に準拠していません
プロトコルには、タイプ「ProtocolB?」のプロパティ「prop」が必要です
候補に一致しないタイプ 'ClassB?' があります。
ClassBがProtocolBに準拠しているため、これは面倒です。
古き良き私はおそらくプロパティを次のように宣言します:
しかし、これを迅速に回避できると思われる唯一の方法は、次のような ivar を追加することです。
これを回避する方法はありませんか?
generics - 関連するプロトコル適合性エラー Swift 2.0
私と同じ問題を提示しているこの投稿を認識していますが、未回答で古いため、ここで更新すると思いました。
これは私が必要とするものの初歩的な例ですが、要点を示しています
ブロック A は機能しますが、具体的なセル クラスを知る必要があるため、多くの異なるセルのリストがある場合、その具体的な型がわからないものは機能しません。
ブロック B は次のエラーをスローします。
エラー: プロトコル 'BaseCell' は、Self または関連型の要件があるため、一般的な制約としてのみ使用できます
ブロック B を達成する方法はありますか?