警告: 'UnsafeBufferPointer' の初期化 ' はバッファポインタがぶら下がる結果になる 質問する

警告: 'UnsafeBufferPointer' の初期化 ' はバッファポインタがぶら下がる結果になる 質問する

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.appendwithUnsafePointer

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))
        }
    }
}

おすすめ記事