問題タブ [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 関数宣言に注釈を付けますか?
クラスがいくつかのプロトコルに準拠しているために存在することを示すために、Swift で関数宣言に注釈を付けるための標準メカニズムはありますか?
たとえば、クラスが に準拠しているため、この宣言が存在する場合がありますNSCoding
。( でマークするとoverride
構文エラーが発生するため、探している種類の注釈ではありません。) 理想的には、コード レベルの注釈を探しています (たとえばoverride
、 の代わりに/*! ... */
)。
swift - 複数のジェネリック型を引数として列挙型を渡す
Swift 2 に問題があります - XCode バージョン 7.0 ベータ 5 (7A176x)
2 つのジェネリック型を持つ enum State があります。関数printState
は State 引数を取り、引数に基づいて「One」または「Two」を出力します
以下のようにprintStateを呼び出すと。
printState の 2 回目の呼び出しでコンパイル エラーが発生する -
エラー: タイプ '(secondStruct: Struct2)' の引数リストで 'Two' を呼び出せません printState(State.Two(secondStruct:Struct2()))
T と U がクラス型に制約されている場合、すべてが正常に機能します。しかし、T と U がプロトコル タイプの場合にのみ、このエラーが発生します。また、case Two も Protocol1 を受け入れるようにすることで、このエラーを取り除くことができますが、実際には必要ありません。
このエラーが発生するのはなぜですか? ケース 2 が Protocol1 のみを受け入れるようにするには、どうすればこれを機能させることができますか。
swift - Swift でプロトコル間の関係を指定する
別のプロトコルに準拠するいくつかの型オブジェクトを管理するプロトコルを指定したいと考えています。このような:
これをコンパイルしようとすると、エラーが発生します。
func getElements() -> [FooElement]
候補が一致しないタイプの を持っていることを示唆して() -> [FooElement]
いますが、代わりに を期待してい() -> [Element]
ます。
この種のエラーはどのように修正できますか?
アップデート:
このソリューションは機能しているようです:
しかし、次のような変数を作成しようとすると:
新しいエラーが表示されます:
swift - Swift 2.0: 汎用プロトコルに準拠するオブジェクトのコレクション型を作成する
例えば:
に準拠するオブジェクトの配列である配列が必要SomeProtocol
です。理論的には問題ないように思えますが、次のエラー メッセージが表示されます。
関連付けられた型の要件が含まれているため、一般的な制約として使用できません。
そして、それは理にかなっていると思います。結局のところ、配列はジェネリック構造体でもあるため、コンパイラーは、両方がジェネリックSomeProtocol
である実際に与えられた型を理解できません。Array
だから私の質問は - に準拠するオブジェクトの配列を持つことができるはずだと思いますSomeProtocol
- これは現在 Swift 2.0 で可能ですか? 私はこれについて間違った方法で考えていますか?
ios - UIViewのプロトコルはviewControllerのオブジェクトを変更できませんか?
drawRect UIView にバナーを配置したかったのですが、「bannerView.rootViewController = self」という行で警告が表示されます。そのため、バナーをviewControllerに配置しました。drawRect の値でバナーの位置を変更します。値は印刷できますが、バナーは移動を拒否します。コードは次のとおりです。
ビューコントローラー:
UIView:
swift - Swiftでは、Objective-CクラスのプロパティがSwift @objプロトコルの計算されたプロパティ要件を満たすことは可能ですか?
たとえば、既存の Objective-C クラスから Swift プロトコルを抽出したいと考えていますMyFoo
。このプロトコルを と呼びましょうFooProtocol
。
状況は次のようになります。
次に、これを行うことを許可する必要があります。
しかし、「MyFoo はプロトコル FooProtocol に準拠していません」と言われます。わかった。当然のことですが、プロトコル拡張には少しの調整が必要だと思います。
しかし、コンパイラから次のようなエラーが表示されます
私は何を間違っていますか?
swift - 引数として自分自身と同じ型を必要とするプロトコル関数に引数として自分自身を渡す
次の値で Future を返す非同期辞書を作成しています。
- すでにキャッシュされている場合はすぐに、または
- (ネットワーク) 操作の後 (まだ行われていない場合)
私のクラス内の辞書はジェネリックなので、クラスもジェネリックです。現在、ユーザーはドキュメントを読み、dataCall
関数を設定する方法を知っている必要があります。これは、ディクショナリがキーの値を取得する方法を次の形式で知る方法です。
ただし、これには、他のプログラマーがデータ呼び出しについて知り、それを設定する必要があります。だから私はプロトコルを書いた
ただし、これを次のように呼び出してみるinit()
と
delegate.dataCallForCacheManager(self)
エラーが発生します
dataCallForDictionary
タイプ '(CacheManager)' の引数リストで呼び出すことはできません
私も作れないvar delegate: CacheDelegate?
ので
Protocol
CacheDelegate
は、Self または関連型の要件があるため、一般的な制約としてのみ使用できます。
そのため、自分自身を引数として渡すことができず、このプロトコルからデータ呼び出しを取得するデリゲートを設定できないという問題に直面しています。何か不足していますか?Swift 2 Voodoo を実行したいと思っています。
おもちゃの例の内容 (Futures と辞書とすべてを除く) は次のとおりです。