Swift 5. 'withUnsafeBytes'已被弃用:请使用`withUnsafeBytes<R>(...)`代替。

10

我有一个方法,需要在用户连接时打印用户名,但是出现了错误withUnsafeBytes已弃用:请使用withUnsafeBytes(_:(UnsafeRawBufferPointer)throws -> R)rethrows -> R代替

方法:

    func joinChat(username: String) {
      let data = "iam:\(username)".data(using: .ascii)!
      self.username = username
      _ = data.withUnsafeBytes { outputStream.write($0, maxLength:    data.count) } //deprecated
    }

有人知道如何解决吗?

2个回答

6
似乎withUnsafeBytes在Swift 5中依赖于assumingMemoryBound(to:),关于此有一些线程讨论,例如:https://forums.swift.org/t/how-to-use-data-withunsafebytes-in-a-well-defined-manner/12811 为了消除这个错误,你可以:
func joinChat(username: String) {
    let data = "iam:\(username)".data(using: .ascii)!
    self.username = username
    _ = data.withUnsafeBytes { dataBytes in
        let buffer: UnsafePointer<UInt8> = dataBytes.baseAddress!.assumingMemoryBound(to: UInt8.self)
        OutputStream(toMemory: ()).write(buffer, maxLength: dataBytes.count)
    }
}

但这似乎不太安全,也容易引起混淆。我认为选择@OOper的解决方案会更好。


警告正在停止流程! - Hope

4

你可能会找到一些关于如何使用新的Data.withUnsafeBytes的解决方案,但如果你只是用它来调用OutputStream.write,还有另一种选择:

func joinChat(username: String) {
    let str = "iam:\(username)"
    self.username = username
    outputStream.write(str, maxLength: str.utf8.count)
}

这段代码没有一个功能能在username包含非ASCII字符时使您的应用程序崩溃,但除此之外,它可以正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接