0

我从 C++ 到 Swift。我在协议和结构方面遇到这种情况(我正在使用随机数):(
1)一个协议RandomPr,它指定了一些方法,例如randFloat()返回 0 到 1 之间的浮点数。
(2)一个使用“实”随机数生成器。 (3) 一个实现的结构,但具有其他方法,例如加载一个浮点数组,然后在我调用实例时反刍这些浮点数。(用于测试目的。)RandomSRandomPr
FakeRandomSRandomPrloadFloat()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没有方法,并且编译器没有看到确实有方法。fakeRngRandomPrloadFloatfakeRng

我尝试制作另一个FakeRandomPr包含额外方法的协议FakeRandomS,并定义

var fakeRng: RandomPr & FakeRandomPr = FakeRandomS()

但是,令人沮丧的是,我现在再次收到“Inout 参数可以设置为类型不是...的值”错误。

我可以在 C++ 中毫无问题地做同样的事情(一个纯抽象基类和两个子类,通过引用传入),而且我想要传入的其中一个有额外的方法并不重要。我想把它翻译成协议和结构。什么是 Swift 解决方案?

4

1 回答 1

1

什么是 Swift 解决方案?

您可能需要使用泛型:

func doSomething<RP: RandomPr>(rng: inout RP) {
    //...
}

Swift 不仅仅是C++ 的另一种语法,最好以 Swifty 的方式思考。

于 2021-03-03T05:53:04.157 回答