我从 C++ 到 Swift。我在协议和结构方面遇到这种情况(我正在使用随机数):(
1)一个协议RandomPr
,它指定了一些方法,例如randFloat()
返回 0 到 1 之间的浮点数。
(2)一个使用“实”随机数生成器。
(3) 一个实现的结构,但具有其他方法,例如加载一个浮点数组,然后在我调用实例时反刍这些浮点数。(用于测试目的。)RandomS
RandomPr
FakeRandomS
RandomPr
loadFloat()
randFloat()
FakeRandomS
现在我有一个函数DoSomething(rng: inout RandomPr)
,我想将它与RandomS
和一起使用FakeRandomS
。该参数必须输入输出,因为我需要更新 RNG(无论是真的还是假的)。DoSomething
使用RandomS
. _
但如果我这样做
var fakeRng = FakeRandomS()
fakeRng.loadFloat([0.1, 0.2, 0.3])
DoSomething(rng: &fakeRng)
我收到一个错误“Inout 参数可以设置为类型不是 'FakeRandomS' 的值。建议的修复方法是定义fakeRng
为
var fakeRng: RandomPr = FakeRandomS()
但是现在尝试调用失败,因为loadFloat
没有方法,并且编译器没有看到确实有方法。fakeRng
RandomPr
loadFloat
fakeRng
我尝试制作另一个FakeRandomPr
包含额外方法的协议FakeRandomS
,并定义
var fakeRng: RandomPr & FakeRandomPr = FakeRandomS()
但是,令人沮丧的是,我现在再次收到“Inout 参数可以设置为类型不是...的值”错误。
我可以在 C++ 中毫无问题地做同样的事情(一个纯抽象基类和两个子类,通过引用传入),而且我想要传入的其中一个有额外的方法并不重要。我想把它翻译成协议和结构。什么是 Swift 解决方案?