withUnsafeMutableBytes 'устарело предупреждение xcode - PullRequest
0 голосов
/ 22 марта 2020

У меня есть 3 места (всего 7 предупреждений) в проекте, где XCode показывает следующее предупреждение:

withUnsafeMutableBytes 'устарело

Я пытался решить эти предупреждения самостоятельно, но безуспешно. Кто-нибудь может мне помочь?

1. let status = cryptData.withUnsafeMutableBytes {ivBytes in
        SecRandomCopyBytes(kSecRandomDefault, kCCBlockSizeAES128, ivBytes)
    }

2. let cryptStatus = cryptData.withUnsafeMutableBytes {cryptBytes in
        data.withUnsafeBytes {dataBytes in
            keyData.withUnsafeBytes {keyBytes in
                CCCrypt(CCOperation(kCCEncrypt),
                        CCAlgorithm(kCCAlgorithmAES),
                        options,
                        keyBytes,
                        keyLength,
                        cryptBytes,
                        dataBytes,
                        data.count,
                        cryptBytes + kCCBlockSizeAES128,
                        cryptLength,
                        &numBytesEncrypted)
            }
        }
    }

3. let cryptStatus = clearData.withUnsafeMutableBytes {cryptBytes in
        data.withUnsafeBytes {dataBytes in
            keyData.withUnsafeBytes {keyBytes in
                CCCrypt(CCOperation(kCCDecrypt),
                        CCAlgorithm(kCCAlgorithmAES128),
                        options,
                        keyBytes,
                        keyLength,
                        dataBytes,
                        dataBytes + kCCBlockSizeAES128,
                        clearLength,
                        cryptBytes,
                        clearLength,
                        &numBytesDecrypted)
            }
        }
    }

Ответы [ 2 ]

1 голос
/ 29 марта 2020

Как указывает @Enricoza, теперь устаревший параметр, данный закрытию withUnsafeMutableBytes, имеет тип UnsafeMutablePointer, а новый - UnsafeMutableRawBufferPointer. Чтобы получить UnsafeMutablePointer или UnsafeMutableRawPointer, который может принимать CommonCrypto, необходимо получить необязательное свойство .baseAddress для *Bytes объектов, которые вы получаете из замыканий.

Вот библиотека, которая использует новые параметры закрытия: https://github.com/backslash-f/aescryptable/blob/master/Sources/AESCryptable/AESCryptable.swift

Вы заметите, что основное отличие состоит в том, что он разворачивает baseAddress es в предложении guard, выдает ошибку, если таковая имеется терпит неудачу, затем использует эти baseAddress вместо старых параметров для функций CommonCrypto.

1 голос
/ 25 марта 2020

Если вы нажмете + клик на вызове вашего метода, вы увидите, что вы используете устаревший метод, который, к сожалению, имеет то же имя нового метода, но имеет другие типы параметров:

    /// Mutate the bytes in the data.
    ///
    /// This function assumes that you are mutating the contents.
    /// - warning: The byte pointer argument should not be stored and used outside of the lifetime of the call to the closure.
    @available(swift, deprecated: 5, message: "use `withUnsafeMutableBytes<R>(_: (UnsafeMutableRawBufferPointer) throws -> R) rethrows -> R` instead")
    public mutating func withUnsafeMutableBytes<ResultType, ContentType>(_ body: (UnsafeMutablePointer<ContentType>) throws -> ResultType) rethrows -> ResultType

    @inlinable public mutating func withUnsafeMutableBytes<ResultType>(_ body: (UnsafeMutableRawBufferPointer) throws -> ResultType) rethrows -> ResultType

To Во избежание предупреждения вы должны использовать второй метод и (конечно) изменить реализацию замыкания (поскольку теперь у него есть другой тип параметра).

Для принудительного вызова неотрицательного метода вы можете просто заставить тип параметра в замыкании следующим образом:

let status = cryptData.withUnsafeMutableBytes { (ivBufferPointer: UnsafeMutableRawBufferPointer) in
        // Do your logic here with the UnsafeMutableRawBufferPointer
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...