Как избавиться от предупреждения, используя withUnsafeBytes () и outputStream.write () в Swift 5.0 - PullRequest
2 голосов
/ 05 мая 2019

У меня есть следующая функция ниже, и я не могу избавиться от предупреждения компиляции.Warning = 'withUnsafeBytes' устарела: используйте withUnsafeBytes<R>(_: (UnsafeRawBufferPointer) throws -> R) rethrows -> R вместо

Я попробовал онлайн-документ о withUnsafeBytes (включая stackoverflow.com), но плохая документация withUnsafeBytes () смешалась с необычной функцией outputStream.write (котораятребует UnsafePointer) сделал меня неспособным понять, как указатель должен быть передан, ни на что ссылается $ 0.Я знаю, что $ 0 является неявным параметром замыкания кода, но полученный код не перечисляет явно параметры замыкания, и я не могу понять, что такое $ 0.

func sendMessage(message: String)
{
    // URL Encode the message
    let URLEncodedMem = UnsafeMutablePointer<UInt8>.allocate(capacity: message.utf8CString.count * 3 + 1)
    defer { URLEncodedMem.deallocate() }
    urlEncode( URLEncodedMem, message )
    let urlEncodedMsg = String( cString: URLEncodedMem )

    // Build the server message to send
    let strToSend = "GET /userInput.mtml?userInput=\(urlEncodedMsg) HTTP/1.1\r\n"
            +       "Host: \(hostName):\(hostPort)\r\n\r\n"
    let data = strToSend.data(using: .utf8)!

    _ = data.withUnsafeBytes { outputStream.write($0, maxLength: data.count) }  // Warning = 'withUnsafeBytes' is deprecated: use `withUnsafeBytes<R>(_: (UnsafeRawBufferPointer) throws -> R) rethrows -> R` instead
}   //  sendMessage

Я бы хотел, чтобы код продолжалсянадеюсь, что даже когда Swift внесет другие изменения с помощью withUnsafeBytes.

Я подозреваю, возможно, проблема в том, что withUsafeBytes> не поддерживается ??Не уверен ??

1 Ответ

0 голосов
/ 05 мая 2019

Это скомпилирует без ошибок в Swift 5.

let strToSend = "GET /userInput.mtml?userInput=\(urlEncodedMsg) HTTP/1.1\r\n"
    +       "Host: \(hostName):\(hostPort)\r\n\r\n"
let data = strToSend.data(using: .utf8)!

_ = data.withUnsafeBytes { outputStream.write($0.bindMemory(to: UInt8.self).baseAddress!, maxLength: data.count) }

(Вы можете найти некоторые статьи об устаревании withUnsafeBytes в SO.)

Но в вашем случае вы можете просто написать это как:

let strToSend = "GET /userInput.mtml?userInput=\(urlEncodedMsg) HTTP/1.1\r\n"
    +       "Host: \(hostName):\(hostPort)\r\n\r\n"

outputStream.write(strToSend, maxLength: strToSend.utf8.count)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...