問題タブ [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 に答える
2258 参照

ios - Swift: プロトコルのプロパティに値を割り当てることができませんでした?

クラス A は文字列値を提供します。クラス B は、内部に A 型の 2 つのメンバーを持ち、計算されたプロパティ "v" を提供して、それらのいずれかを選択します。

このコードはシンプルで機能します。A と B の両方にメンバー「値」があるため、次のようなプロトコルにします。

次のコードを変更すると

それは再び動作します!

これは Swift のバグですか、それともプロトコルの特性に特有のものですか?

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

ios - プロトコルを使用した複数の API 呼び出し (サーバー要求) の実装

私は Swift で iOS 用のアプリを作成しており、API 呼び出しロジックを ViewController の外に保持しようとしています。以下で説明する 1 つの API 呼び出しについて、このチュートリアルに従いました。

ViewController が実装するプロトコル「APIControllerProtocol」を作成してから、タイプ APIControllerProtocol のインスタンスを保持する「delegate」というプロパティを含む APIController クラスを作成しています。プロトコルは単純に次のように定義されます。

そして、ViewController は、API 呼び出しが JSON データを返した後に呼び出される didReceiveAPIResults 関数を実装します。ViewController には、API を呼び出す関数を呼び出すための APIController のインスタンスも含まれます。

この時点で、API 呼び出しを実行する ViewController を増やしたいと考えています。ViewController ごとに 1 つの API 呼び出しのみを行う必要がある場合は、APIController に別の関数を追加するだけで、新しい ViewController に同じプロトコルを使用させることができます。ただし、2 つ以上の API 呼び出しを行う必要がある ViewController がある場合、このロジックには欠陥があります。

  1. ViewController で didReceiveAPIResults を 2 つの異なる方法で呼び出すことができません。
  2. 複数の「デリゲート」プロパティを APIController クラスに追加して、さまざまな種類のプロトコルを保持することは道だとは思いません。

  3. プロトコルで複数の関数を定義するということは、1 つの API 呼び出しのみを行う必要がある ViewControllers でこれらすべての関数を実装する必要があることを意味します。

この問題を解決するための私のアイデアは

  1. ViewControllerごとにAPIControllerクラスとAPIControllerProtocolを作る

  2. APIControllerProtocol でオプションの関数を使用して、すべての ViewController がすべての関数を実装する必要がないようにします (これが実際にどのように機能するかはわかりません)。

他の洞察をいただければ幸いです。

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

swift - Equatable プロトコルを強制する Swift プロトコル

2 つのプロトコルを定義しました。Equatable プロトコルを適用するには、最初のもの (NameProtocol) が必要です。他のクラス (BuilderProtocol) には、最初のクラス (NameProtocol) を返すメソッドがあります。

コンパイラ エラー:「プロトコル 'NameProtocol' は、自己型または関連付けられた型の要件があるため、一般的な制約としてのみ使用できます」

NameProtocol に準拠し、== を定義できるオブジェクトを返すには、build() によって返されるオブジェクトが必要です。

これを機能させる方法はありますか?

ありがとう


BuilderProtocol で typealias を使用している場合、配列宣言を機能させるにはどうすればよいですか?


結論

Equatable を削除し、isEqual メソッドを実装します。

0 投票する
4 に答える
12572 参照

ios - 「致命的なエラー: アレイは Objective-C からブリッジできません」—なぜ試みているのですか、スウィフト?

Swift プロトコルを宣言しました。

このプロトコルの複数の実装 (いくつかのクラス、いくつかの列挙型) を宣言します。

次のように宣言されたプロパティを持つView Controllerがあります。

このプロパティをOption別の VC のプロトコルを実装するオブジェクトの配列に設定しようとするとprepareForSegue、実行時エラーが発生します。

なぜこれが機能しないのですか?コンパイラは必要なすべての情報を持っていますが、Objective-C がそれと何をしなければならないかはまったくわかりません。私のプロジェクトには Swift ファイルしか含まれておらず、これらの配列はフレームワーク メソッドに出入りしていません。にブリッジする必要がありますNSArray