Swift调用DynamoDB报Extra trailing closure passed in call错误
问题原因
该报错和配置无关,是AWS SDK for Swift版本与示例代码API不匹配导致:
- 你复制的示例是基于0.x预览版SDK编写的,该版本API采用尾随闭包回调的形式返回结果
- 1.0正式版及之后的AWS SDK for Swift全面废弃了回调式API,所有服务调用方法均改为Swift原生
async/await异步模型,getItem方法不存在接收回调闭包的形参,额外传入的尾随闭包就会触发Extra trailing closure passed in call编译错误。
修正方案
直接使用SDK提供的async/await接口即可,修正后的函数代码如下:
func getDynamoDbItem(dynamoDbClient: DynamoDbClient, nameOfTable: String, keyName: String, keyVal: String) async { let keyToGet = [keyName : DynamoDbClientTypes.AttributeValue.s(keyVal)] do { let response = try await dynamoDbClient.getItem(input: GetItemInput(key: keyToGet, tableName: nameOfTable)) guard let numbersMap = response.item else { return } for returnedKey in numbersMap { print("\(returnedKey.key) : \(returnedKey.value)") } } catch { print(error) } }
调用注意事项
如果需要在同步上下文(比如AppKit的按钮点击事件、视图生命周期方法中)调用上述async函数,需要将调用逻辑包裹在Task块中,示例:
@IBAction func handleQueryClick(_ sender: NSButton) { // 传入初始化好的DynamoDbClient实例、表名、键名键值即可 Task { await getDynamoDbItem( dynamoDbClient: sharedDynamoDbClient, nameOfTable: "UserTable", keyName: "userId", keyVal: "10001" ) } }
如果需要兼容旧的回调逻辑,不需要降级SDK版本,自行用Task包装上述async方法,在拿到结果/捕获错误后手动调用传入的回调闭包即可。
内容的提问来源于stack exchange,提问作者Kronos_Rob
相关产品推荐
相关产品推荐

