2
protocol ValueHolder {
}

struct A: ValueHolder {
    var value = 5
}

var x: ValueHolder = A()

func f(a: inout A) {
    a.value = 10
}

pass x to f を使いたいです。出来ますか?

編集:値のセマンティクスと inout パラメーターについてすべてのスタッフを理解しています。問題は、xにキャストする必要があることです.onで使用できるように、それをコピーせずに(型付きのコピーを作成して)Aできるかどうか疑問に思っています。asfx

4

1 に答える 1

3

パス x (およびそのコピーではない) を f に使用したいと考えています。出来ますか?

正確ではありません — 少なくとも、パラメーターが A の場合はそうではありません。A は構造体です。であってもinout、構造体は依然として値型です。inout元の値を置き換えることができますが、置き換えられるのは別の A です。簡単に言えば、構造体をその場で変更することはできません。

そうなると、あなたの質問は意味を失っているようです。inout構造体はその場で変更できないため、ここで使用する本当の理由はまったくありません。を必要とすること何もしていませんinoutinout値のセマンティクスをドロップして受け入れることもできます。

func f(a: A) -> A {
    var a = a
    a.value = 10
    return a
}
x = f(a:x as! A)

本当に を保持したい場合は、次のように ValueHolder としてinout入力し、関数内でキャストします。a:

var x: ValueHolder = A()
func f(a: inout ValueHolder) {
    var b = a as! A
    b.value = 10
    a = b
}
f(a:&x)
(x as! A).value // 10
于 2016-12-29T20:58:48.497 に答える