В Xcode 10.2, Swift 5, использование $0.load(as:)
не работало для меня, как при чтении из указателя, так и при записи в него.
Вместо этого использование $0.baseAddress?.assumingMemoryBound(to:)
, кажется, работает хорошо.
Пример чтения из буфера указателя (код не связан с вопросом):
var reachability: SCNetworkReachability?
data.withUnsafeBytes { ptr in
guard let bytes = ptr.baseAddress?.assumingMemoryBound(to: Int8.self) else {
return
}
reachability = SCNetworkReachabilityCreateWithName(nil, bytes)
}
Пример записи в указатель буфера (код не связан с вопросом):
try outputData.withUnsafeMutableBytes { (outputBytes: UnsafeMutableRawBufferPointer) in
let status = CCKeyDerivationPBKDF(CCPBKDFAlgorithm(kCCPBKDF2),
passphrase,
passphrase.utf8.count,
salt,
salt.utf8.count,
CCPseudoRandomAlgorithm(kCCPRFHmacAlgSHA1),
rounds,
outputBytes.baseAddress?.assumingMemoryBound(to: UInt8.self),
kCCKeySizeAES256)
guard status == kCCSuccess else {
throw Error.keyDerivationError
}
}
Код из вопроса будет выглядеть так:
let value = data.withUnsafeBytes {
$0.baseAddress?.assumingMemoryBound(to: UInt32.self)
}
В тех случаях, когда предупреждение 'withUnsafeBytes' is deprecated: use withUnsafeBytes<R>(…)
сохраняется, похоже, что компилятор может запутаться, когда замыкание имеет только одну строку . Если у замыкания есть две или более строки, это может устранить неоднозначность.