Я обновился до swift 5, и одна из зависимостей, которые я использую, не будет компилироваться в swift 5. Я исправил это, но теперь я получаю 350+ предупреждений об устаревании по всему файлу.Все они похожи на это:
withUnsafeMutableBytes
устарело: используйте withUnsafeMutableBytes<R>(_: (UnsafeMutableRawBufferPointer) throws -> R) rethrows -> R
вместо
И это фрагмент кода (в основном это просто вызовфункции библиотеки ac):
var k = Data(count: crypto_generichash_keybytes())
k.withUnsafeMutableBytes { kPtr in
flutter_sodium.crypto_generichash_keygen(kPtr)
}
Для справки, в приведенном выше коде crypto_generichash_keybytes () просто возвращает size_t, а сигнатура crypto_generichash_keygen
равна void crypto_generichash_keygen(unsigned char k[crypto_generichash_KEYBYTES]);
.
Я выяснил (как в этом ответе говорится), что для решения этой проблемы следует вызвать kPtr.baseAddress:
var k = Data(count: crypto_generichash_keybytes())
k.withUnsafeMutableBytes { kPtr in
flutter_sodium.crypto_generichash_keygen(kPtr.baseAddress)
}
, поскольку для этого следует использовать вариант withUnsafeMutableBytes<ResultType>
, а не устаревший withUnsafeMutableBytes<ResultType, ContentType>
,Однако вместо этого это приводит к ошибке
значение типа 'UnsafeMutablePointer <_>' не имеет члена 'baseAddress'.
Если я явно укажу resultType и kPtr:
var k = Data(count: crypto_generichash_keybytes())
k.withUnsafeMutableBytes { (kPtr: UnsafeMutableRawBufferPointer) -> Void in
flutter_sodium.crypto_generichash_keygen(kPtr.baseAddress)
}
Вместо этого я получаю
UnsafeMutableRawBufferPointer 'не конвертируется в' UnsafeMutablePointer <_> '.
Есть ли быстрые экспертытам, что может помочь мне найти правильный способ сделать это?Я знаю, что предупреждения - это просто предупреждения, но я предпочитаю иметь код, который компилируется без предупреждений.
Я взглянул на Swift 5.0: «withUnsafeBytes» устарело: используйте «withUnsafeBytes (...) перед публикацией этого вопроса, и это не помогает моей ситуации, так как я не загружаю указатель, а использую данные.Кроме того, я сделал именно то, что говорит мне документация, но это все равно не помогает.
РЕДАКТИРОВАТЬ: Чтобы быть немного более ясным, некоторые из 350+ предупреждений были связаны с кодом, где Data
выделяется в коде, однако некоторые из них, где я получаю Data
от внешнегоисточник.Это выглядит примерно так:
let args = call.arguments as! NSDictionary
let server_pk = (args["server_pk"] as! FlutterStandardTypedData).data
let server_sk = (args["server_sk"] as! FlutterStandardTypedData).data
let client_pk = (args["client_pk"] as! FlutterStandardTypedData).data
var rx = Data(count: flutter_sodium.crypto_kx_sessionkeybytes())
var tx = Data(count: flutter_sodium.crypto_kx_sessionkeybytes())
let ret = rx.withUnsafeMutableBytes { rxPtr in
tx.withUnsafeMutableBytes { txPtr in
server_pk.withUnsafeBytes { server_pkPtr in
server_sk.withUnsafeBytes { server_skPtr in
client_pk.withUnsafeBytes { client_pkPtr in
flutter_sodium.crypto_kx_server_session_keys(rxPtr, txPtr, server_pkPtr, server_skPtr, client_pkPtr)
}
}
}
}
}
с соответствующим вызовом метода
SODIUM_EXPORT
int crypto_kx_client_session_keys(unsigned char rx[crypto_kx_SESSIONKEYBYTES],
unsigned char tx[crypto_kx_SESSIONKEYBYTES],
const unsigned char client_pk[crypto_kx_PUBLICKEYBYTES],
const unsigned char client_sk[crypto_kx_SECRETKEYBYTES],
const unsigned char server_pk[crypto_kx_PUBLICKEYBYTES])
__attribute__ ((warn_unused_result));
(и я знаю, что код на самом деле не является оптимальным быстрым, но когда речь идет о взаимодействии между дротиком иswift - вот что пришла команда флаттера для того, как это сделать).
Когда я задал вопрос, я пытался отогнать его до самого простого случая, но в этом случае был конкретный ответ, который отличается отобщая проблема у меня.