2017-09-20 4 views
0

Objective-cには、ポインタへのポインタの概念があります。もしあなたが、これはそれがUnsafeMutablePointerswsでUnsafeMutablePointerを使用する方法4

func makeFive(_ n: UnsafeMutablePointer<Int>) { 
    n.memory = 5 
} 
var n: Int = 0 
makeFive(&n) 
// n is now 5 

なりスウィフト3に架設されている場合は、元の

void makeFive(int *n) { 
    *n = 5; 
} 

int n = 0; 
makeFive(&n); 
// n is now 5 

しかし、スウィフト4のように、この動作が変更され、メモリましたアクセスできる最初のポインタを逆参照する場合プロパティはもはや利用できません。

makeFive(_ :)関数のswift 4に相当するものは何ですか?

更新 Hamishのおかげで、私は今、 "メモリ"がpointeeに改名されたことを知っています。

+1

を、それは '.pointee'です。ここで 'UnsafeMutablePointer'を使用しないでください。呼び出し元側の変数を変更する必要がある場合は、 'inout'を使用します(これは頻繁ではありません)。 – Hamish

+0

訂正ありがとう、まあまあです!さもなければ、私はそれがスタックのオーバーフローで見つけるでしょう。私は名前の変更を知らなかった。私は主にUnsafeMutablePointerをobjective-cとの互換性のために使用しています。なぜなら、 "inout"は迅速な機能だからです。 – DerrickHo328

答えて

0

確認してください:*スウィフト3 *のようhttps://developer.apple.com/documentation/swift/unsafemutablepointer

func makeFive(_ n: UnsafeMutablePointer<Int>) { 
    n.initialize(to: 5) 
} 
var n: Int = 0 
makeFive(&n) 
// n is now 5 
+0

これに注意してください。 pointeeは*既に*初期化されているので、実際に 'initialize(to:)'を呼び出すべきではありません。 'Pointee'は簡単な型(' Int')なので、この場合は動作しますが、非重要なpointee型に対しては未定義の動作が生成されます(少なくとも、最良の場合のシナリオはまだ漏れていますがメモリ)。ここで必要とする操作は、pointeeへの* assignment *です。これはポインタの 'pointee'プロパティを設定することによって行われます。 – Hamish

関連する問題