iOS Swift PromiseKit中使用then存Realm报错的问题求助
解决Promise then方法类型不匹配的问题
看起来你遇到的是Promise(大概率是PromiseKit)中then和done方法的类型要求差异导致的错误。先帮你理清楚问题根源,再给出可行的解决方案:
问题原因
done方法的设计是用来处理无返回值的收尾操作,它接受的闭包类型是(T) -> Void——也就是说你只需要在闭包里执行逻辑,不需要返回任何值。但then方法的作用是链式传递Promise流,它要求闭包必须返回一个新的Promise或者一个具体的值(用来生成新的Promise)。你之前传入的(Any) -> Void闭包不符合这个要求,所以才会抛出类型转换错误。
另外,用Any作为参数类型也会干扰Swift的类型推断,尽量明确你的API返回数据的具体类型(比如[Translator]),能减少这类类型问题。
解决方案
根据你需要把数据存入Realm的场景,分两种情况处理:
1. Realm存储是同步操作
如果你的Realm写入是同步执行的,可以用map方法(或者调整then的闭包返回值)来处理:
// 假设translators()返回的是Promise<[Translator]>,明确类型而非Any Translator().translators() .map { translators -> Void in do { let realm = try Realm() try realm.write { // 执行Realm存储逻辑,比如添加或更新数据 realm.add(translators, update: .modified) } } catch { // 把存储错误抛出,让后续的catch处理 throw error } } .done { // 存储完成后的后续操作 print("数据已成功存入Realm") } .catch { error in // 统一处理API请求或存储过程中的错误 print("出现错误:\(error.localizedDescription)") }
这里map方法接受的闭包可以返回Void,它会自动把结果包装成Promise<Void>,完美衔接后续的链式调用。
2. Realm存储是异步操作(或需要包装成Promise)
如果你的存储逻辑是异步的,或者想把同步操作包装成Promise风格,用then返回一个新的Promise即可:
Translator().translators() .then { translators -> Promise<Void> in return Promise { seal in do { let realm = try Realm() try realm.write { realm.add(translators, update: .modified) } // 存储成功,fulfill这个Promise seal.fulfill(()) } catch { // 存储失败,把错误传递出去 seal.reject(error) } } } .done { print("异步存储完成") } .catch { error in print("错误:\(error)") }
这种方式下,then的闭包返回了Promise<Void>,完全符合方法的类型要求,不会再出现类型转换错误。
额外提示
- 尽量避免用
Any作为Promise的返回类型,明确具体的模型类型(比如Translator数组),能让Swift的类型推断更准确,减少这类编译错误。 - 如果只是单纯执行副作用操作(比如存储后不需要传递新值),
done本来就是更合适的选择,但如果必须用then(比如需要在链式中插入存储逻辑并继续传递),上面的方案就能解决问题。
内容的提问来源于stack exchange,提问作者Ahsan Aasim
相关产品推荐
相关产品推荐

