0

私は C++ から Swift に移行しています。私はプロトコルと構造体に関してこの状況を持っています (私は乱数を扱っています):
(1) 0 と 1 の間の Float を返すRandomPrようなメソッドがあることを指定するプロトコル。 (2) " real」乱数ジェネレーター。 (3)を実装する構造体ですが、インスタンスを呼び出すと逆流する Float の配列をロードするなどの追加のメソッドがあります。(テスト目的のため。)randFloat()
RandomSRandomPr
FakeRandomSRandomPrloadFloat()randFloat()FakeRandomS

これで、 と の両方でDoSomething(rng: inout RandomPr)使用したい関数 ができました。RNG を更新する必要があるため (本物か偽物かに関係なく)、パラメーターは in-out でなければなりません。のインスタンスで問題なく呼び出すことができます。RandomSFakeRandomSDoSomethingRandomS

でももしそうなら

var fakeRng = FakeRandomS()
fakeRng.loadFloat([0.1, 0.2, 0.3])
DoSomething(rng: &fakeRng)

「Inout 引数が 'FakeRandomS' 以外のタイプの値に設定される可能性があります。推奨される修正は、次のように定義することです」というエラーが表示されますfakeRng

var fakeRng: RandomPr = FakeRandomS()

しかし、メソッドがなく、コンパイラがそれを認識していないためloadFloat、 onを呼び出そうとするとfakeRng失敗します。RandomPrloadFloatfakeRng

FakeRandomPr持っている余分なメソッドを含む別のプロトコルを作成しFakeRandomSて、定義しようとしました

var fakeRng: RandomPr & FakeRandomPr = FakeRandomS()

しかし、イライラすることに、「Inout引数を...以外の型の値に設定できます」というエラーが再び表示されます。

これと同等のことを C++ で問題なく行うことができました (純粋な抽象基底クラスと 2 つの子クラスを参照渡しで渡しました)。また、渡したいものの 1 つに追加のメソッドが含まれていても問題ありませんでした。これをプロトコルと構造体に変換したいと思います。Swift ソリューションとは何ですか?

4

1 に答える 1