Swift 5.2 / Xcode 11.4 にアップデートした後、次のコードに対して警告が表示されました。
extension Data {
init<T>(from value: T) {
var value = value
let pointer = UnsafeBufferPointer(start: &value, count: 1)
self.init(buffer: pointer)
}
func to<T>(type: T.Type) -> T {
return self.withUnsafeBytes { $0.load(as: T.self) }
}
}
オンラインポインタを UnsafeBufferPointer(開始: &値、カウント: 1) にします。私は
'UnsafeBufferPointer' の初期化により、バッファ ポインタがぶら下がる
@silenceWarning を使うこともできますが、これは汚い解決策です。ポインタをどこかに保存して、将来的にクリーンアップする必要があるかもしれません。
ベストアンサー1
私もこれらの迷惑な警告に遭遇しました。
var str = "aaaaabbbbbccccc"
var num1 = 1
var num2 = 22
var data = Data()
// Initialization of 'UnsafeBufferPointer<String>' results in a dangling buffer pointer
data.append(UnsafeBufferPointer(start: &str, count: 1))
// Initialization of 'UnsafeBufferPointer<Int>' results in a dangling buffer pointer
data.append(UnsafeBufferPointer(start: &num1, count: 1))
// Initialization of 'UnsafeBufferPointer<Int>' results in a dangling buffer pointer
data.append(UnsafeBufferPointer(start: &num2, count: 1))
@greg の回答を考慮して、 をのクロージャに入れると、警告は表示されなくなりましたData.append
。withUnsafePointer
withUnsafePointer(to: &str) { data.append(UnsafeBufferPointer(start: $0, count: 1)) } // ok
withUnsafePointer(to: &num1) { data.append(UnsafeBufferPointer(start: $0, count: 1)) } // ok
withUnsafePointer(to: &num2) { data.append(UnsafeBufferPointer(start: $0, count: 1)) } // ok
拡張機能はこちら
extension Data {
init<T>(value: T) {
self = withUnsafePointer(to: value) { (ptr: UnsafePointer<T>) -> Data in
return Data(buffer: UnsafeBufferPointer(start: ptr, count: 1))
}
}
mutating func append<T>(value: T) {
withUnsafePointer(to: value) { (ptr: UnsafePointer<T>) in
append(UnsafeBufferPointer(start: ptr, count: 1))
}
}
}