私はC++を学び始めましたが、今はSwiftでもいくつかのことができるかどうか疑問に思っています。Swiftのリファレンス変数を渡す
私はSwiftの関数に変数として引数を渡したときに何が起こったのか考えたことはありませんでした。
例として、変数string
を使用してみましょう。
C++では、関数の引数をコピーするか、参照/ポインタで引数を渡すことができます。
void foo(string s)
またはvoid foo (string& s)
; 第1のケースでは、元の変数のコピーが作成され、fooにコピーが送られます。 2番目のケースでは、私は基本的に、コピーを作成せずにメモリ内の変数のアドレスを渡します。
スウィフトでは、関数への引数をinoutと宣言できます。これは、元のオブジェクトを変更できることを意味します。結果は、私は予想されなかったこと
extension String {
func address() -> String {
return String(format: "%p", self);
}
}
:
1)func foo(s:String)
... 2)func testPassingByReference(s: inout String)
...
私はオブジェクトのアドレスを印刷する文字列を拡張しました見る。
var str = "Hello world"
print(str.address())
0x7fd6c9e04ef0
func testPassingByValue(s: String) {
print("he address of s is: \(s.address())")
}
func testPassingByReference(s: inout String) {
print("he address of s is: \(s.address())")
}
testPassingByValue(s: str)
0x7fd6c9e05270
testPassingByReference(s: &str)
0x7fd6c9e7caf0
私は値によって引数を渡すときにアドレスが異なる理由は理解していますが、引数をinoutパラメータとして渡すときに期待するものではありません。
アップルの開発者向けウェブサイトは、我々は関数に渡すオブジェクトのコピーを避けるためにどのような方法があり、
In Swift, Array, String, and Dictionary are all value types.
がそこで質問があると述べている(私は非常に大きな配列を持つことができますか辞書)またはスウィフトは私たちにそのようなことを許可していないのですか?
興味深いことに、「すべて同じバッキングストレージを共有している」ということを実際に見る方法はありますか?アドレスを印刷するか、デバッガのどこかで表示したいのですか? – Alex
内部の '_buffer'プロパティを突き止めることができます。 'array.withUnsafeBytes'を見て、そこから出てくるポインタを確認することもできます。内部ストレージへのポインタです。しかし、それがどのように動作し、コピーを作成するかについての約束はたくさんありません。あなたはソースコードを見て回ってみることができます:https://github.com/apple/swift –
答えをありがとう。 – Alex