問題タブ [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.
swift - 「自分は?」プロトコル拡張内
プロトコル拡張内で「自己」をキャストしようとしていました。実際のデバイスで実行すると EXC_BAD_ACCESS エラーでクラッシュしましたが、シミュレーターでは問題なく動作しました。これを機能させるにはどうすればよいですか?ありがとう
私のコード全体:
swift - 「Equatable」は拡張機能で自動的に合成できません
これは機能します:
これはしません:
エラーは非常に明確です。
「Equatable」の実装は拡張機能で自動的に合成できません
私の懸念は、Swift の提案SE-0185によれば、これを許可する必要があることです。
SE-0185: 合成
Equatable
とHashable
適合
Equatable
ユーザーは、要件を実装するかHashable
実装せずに型を宣言して、自動合成を選択する必要があります。この準拠は、元の型宣言の一部であるか、同じファイル内の拡張機能に含まれている必要があります(拡張機能からプライベートおよびファイルプライベート メンバーにアクセスできるようにするため)。
これは Swift 4.1 ( apple/swift#9619 ) で実装されたと言われています。
ただし、コンパイルしようとすると、前に示したエラーが発生します。私はUbuntu 16.04を使用していますが、私が持っているこれらの2つのバージョンのswiftで失敗します:
Swift version 4.1-dev (LLVM 260a172ffb, Clang cd84be6c42, Swift 05b1b2be7c)
Swift version 4.2-dev (LLVM d30879863e, Clang 041fd44ebe, Swift b08fb12358)
何か不足していますか?
swift - フレームワークで宣言されたジェネリックを使用してプロトコル拡張にアクセスする
フレームワーク外のフレームワークに実装されたプロトコル拡張機能にアクセスできますか? つまり、プロトコルを宣言してプロトコル拡張を実装した「フレームワーク」というターゲットがあるとします。フレームワークの外でこのプロトコルにアクセスしようとすると、プロトコル メソッドを再実装するように求められます。フレームワークに実装されている拡張機能を共有できますか?
ありがとう
アンキット
ios - プロトコル拡張初期化子の呼び出し
共通の初期化コードを共有する一連のクラスを構築しようとしています。継承とは別に、プロトコルが進むべき道だと思いました。プロトコルとプロトコル拡張はインスタンス メソッドと静的メソッドで機能しましたが、初期化子で機能させるにはいくつか問題があります。
このプロトコルがあるとしましょう:
isConfigured
ここで、 と の両方にデフォルトの実装を追加したいとしましょうinit()
:
最後に、このプロトコルを実装し、そのデフォルトの実装から利益を得ようとするクラスを作成しましょう。
クラスの新しいインスタンスを構築しようとするOneDriveWrapper
と、クラスの初期化子とデフォルトのプロトコル実装の両方を呼び出す方法を見つけることができません。また、プロトコル定義ごとに必要であり、プロトコル拡張で「実装」されているとは見なされていないように見えるためinit()
、クラスでを省略することはできません。OneDriveWrapper
実際、もっと広く言えば、プロトコル拡張の初期化子を明示的に呼び出す方法を見つけることができませんでした。インスタンス メソッドでは可能だとわかっていたにもかかわらずです。
私は何を間違っていますか?クラスのイニシャライザとプロトコル拡張のイニシャライザの両方を組み合わせる方法を知っていますか? プロトコルと拡張機能ではなく、クラス継承にフォールバックする必要がありますか?
ありがとう!