Swift解码httpsCallable云函数响应



我有一个httpsCallable云函数,它是从应用程序中调用的。从技术上讲,它工作得很好,但正如你所看到的,代码是嵌套的,我觉得这可以更好地处理。我也收到了警告。

响应result?.data的类型为Any,因此我不能在try decoder.decode(PaymentIntent.self, from: data)中直接使用它,因为这需要Data类型。为此,我使用try? JSONSerialization.data(withJSONObject: result?.data)

知道如何将所有内容解码为PaymentIntent模型吗?

let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
functions.httpsCallable("createPaymentIntent").call(data) { (result, error) in
if let error = error as NSError? {
completion(nil, error)
} else {
let data = try? JSONSerialization.data(withJSONObject: result?.data)

if let data = data {
do {
let paymentIntent = try decoder.decode(PaymentIntent.self, from: data) // Expression implicitly coerced from 'Any?' to 'Any'
completion(paymentIntent.clientSecret, nil)
} catch {
completion(nil, error);
}
}
// Update
if let data = result?.data as? NSDictionary {
print(data)

do {
// Cannot convert value of type 'NSDictionary' to expected argument type 'Data'
let paymentIntent = try decoder.decode(PaymentIntent.self, from: data)
completion(paymentIntent.clientSecret, nil)
} catch {
completion(nil, error);
}
}

}
}

Firebase同时添加解码器:

import FirebaseSharedSwift
import FirebaseFunctions
...
func retrieve<T: Decodable>(_ strategy: JSONDecoder.DateDecodingStrategy? = nil) async throws -> T {
let decoder = FirebaseDataDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase

let result = try await functions
.httpsCallable(endpoint, responseAs: T.self, decoder: decoder)
.call(params)
return result
}

如果方法不是泛型的,并且params应该是Encodable,则用类替换T

Firebase可调用函数的swift SDK不返回JSON字符串。它返回一个已经从JSON反序列化的数据类型。它将是一个字典、数组,或者与云函数生成的任何内容直接对应的东西。您应该通过调试来检查result.data实际是什么,然后编写一些代码来验证它是否是您所期望的,并对其进行强制转换以安全地使用它。

你现在不能这么做。您总是会得到一个Dictionary,并且您需要使用该Dictionary的内容自己实例化对象。

然而,他们正在努力:

https://github.com/firebase/firebase-ios-sdk/pull/8854

相关内容

  • 没有找到相关文章

最新更新