【问题标题】:Swift 5. 'withUnsafeBytes' is deprecated: use `withUnsafeBytes<R>(...) instead [duplicate]Swift 5. 'withUnsafeBytes' 已弃用:改用 `withUnsafeBytes<R>(...) [重复]
【发布时间】:2019-04-02 22:13:22
【问题描述】:

我的方法必须在用户连接时打印用户名,但错误 withUnsafeBytes is deprecated: use withUnsafeBytes(_: (UnsafeRawBufferPointer) throws -> R) rethrows -> R instead pops向上。

方法:

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

有人知道怎么解决吗?

【问题讨论】:

    标签: swift


    【解决方案1】:

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

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

    此代码没有在username 包含非ASCII 字符时使您的应用崩溃的功能,但除此之外,它会起作用。

    【讨论】:

      【解决方案2】:

      看起来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 解决方案。

      【讨论】:

      • 警告正在以流形式停止!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-18
      • 1970-01-01
      • 1970-01-01
      • 2020-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多