私は規則を持っています
extension CGColor {
static func color(from color:Color) -> CGColor {
let (r, g, b) = try! retrieveRGB(from: color.in16bitString)
let colorSpace = CGColorSpaceCreateDeviceRGB()
let array = [r, g, b, CGFloat(color.alpha)]
let unsafePointer = UnsafePointer(array)
return CGColor(colorSpace: colorSpace, components: unsafePointer)!
}
private static func retrieveRGB(from in16bitString:String) throws -> (CGFloat, CGFloat, CGFloat) {
...
}
}
「ダングリングポインタの 『UnsafePointer』結果の初期化」を言ったショーライン上の警告「unsafePointer = UnsafePointer(配列)しましょう」。
私は、質問を投稿だけには重複として提出されたスウィフト5でUnsafeMutablePointer警告。これらの答えは役立ちません。アップルのAPIとして要求UnsafePointer
パラメータとして。
しかし、私は最終的にちょうど配列だけでは作品を使用していることを発見しました。
extension CGColor {
static func color(from color:Color) -> CGColor {
let (r, g, b) = try! retrieveRGB(from: color.in16bitString)
let colorSpace = CGColorSpaceCreateDeviceRGB()
let array = [r, g, b, CGFloat(color.alpha)]
return CGColor(colorSpace: colorSpace, components: array)!
}
private static func retrieveRGB(from in16bitString:String) throws -> (CGFloat, CGFloat, CGFloat) {
...
}
}
私が使用することができ、なぜ誰もが知っていArray
たときにUnsafePointer
要求されていますか?
スウィフトのメモリモデルは、オブジェクトのみが、必ずしももはや少なくとも彼らの最後の使用までに固執し、ないことが保証されます。これは、スコープの終わりまで滞在オブジェクト、例えばCとC ++とは異なります。
let unsafePointer = UnsafePointer(array)
この初期化子の呼び出しが最後の使用方法であるため、動作しませんarray
。その初期化子が戻った後、スウィフトは解放して自由であるarray
ことは関係があることを知らないため、UnsafePointer
に依存していますarray
。
私が使用することができ、なぜ誰もが知ってい
Array
たときにUnsafePointer
要求されていますか?
これは、スウィフトの暗黙的な変換ルールの一つです。アレイのバッファへのポインタは、及びの寿命(アレイ構造体自体へのポインタとは異なる者注)に渡されたarray
コールが終了するまで最後に保証されます。その関数は、(それによって配列の割り当てが解除されている可能性ポイント)以降のユーザーのためのポインタを保存しようとする場合は、バグを引き起こす可能性があります。