在 Swift class 中实现 Kotlin 接口

Implement a Kotlin interface in a Swift class

我在一个新的 Kotlin Multiplatform 移动项目中工作,我在将 Kotlin 接口实现到 Swift class.

中时遇到问题

这是我的设置:

来自 kotlin 通用(共享)模块:

interface LocalUserSource {
     suspend fun saveUser(user: User): Boolean
     suspend fun readUser(): User?
}

在Swift中执行协议(我相信协议是由Kotlin/Native生成的):

class DBUserSource : LocalUserSource {
    func readUser(completionHandler: @escaping (common.User?, Error?) -> Void) {
        // read user from core data
    }

    func saveUser(user: common.User, completionHandler: @escaping (KotlinBoolean?, Error?) -> Void) {
        // save user with core data
    }
}

Xcode项目可以看到生成的公共框架,我可以跳转到框架内的class/协议定义

但是构建 Xcode 项目不断导致此错误:

Type 'DBUserSource' does not conform to protocol 'LocalUserSource'

当我在 Xcode 中使用“修复”选项时,它不断重复该方法并显示相同的错误。我已经尝试了所有方法来清理 android 工作室(我在 运行 gradle 构建的地方)和 Xcode.

奇怪的是,我看过这部作品。我已将用户保存并读取到核心数据,但今天我无法使 iOS 方面的工作正常进行。不知道有没有人有过类似的经历,给点指点。

这里还有通用框架的objective-c定义:

__attribute__((swift_name("LocalUserSource")))
@protocol CommonLocalUserSource
@required
- (void)readUserWithCompletionHandler:(void (^)(CommonUser * _Nullable_result, NSError * _Nullable))completionHandler __attribute__((swift_name("readUser(completionHandler:)")));
- (void)saveUserUser:(CommonUser *)user completionHandler:(void (^)(CommonBoolean * _Nullable, NSError * _Nullable))completionHandler __attribute__((swift_name("saveUser(user:completionHandler:)")));
@end;

suspend fun readUser(): User? 在您的 Kotlin 代码中可以为空,而您在 Swift 等效函数签名中使用 non-nullable/non-optional 类型:

func readUser(completionHandler: @escaping (common.User, Error?) -> Void) {
    // read user from core data
}

// The above should be
func readUser(completionHandler: @escaping (common.User?, Error?) -> Void) {
    // read user from core data
}

所以我终于想通了。我的通用模块中有一个通用结果 class,如下所示:

sealed class Result<out T : Any>
class Success<out T : Any>(val data: T) : Result<T>()
class Error(private val exception: Throwable, val message: String? = exception.message) : Result<Nothing>()

inline fun <T : Any> Result<T>.onSuccess(action: (T) -> Unit): Result<T> {
        if (this is Success) action(data)
        return this
    }
inline fun <T : Any> Result<T>.onError(action: (Error) -> Unit): Result<T> {
        if (this is Error) action(this)
        return this
    }

一旦删除它,我就不会再在 Swift 代码和项目 运行 中看到实现错误。老实说,不知道为什么。我假设有泛型和 Kotlin/Native。但是,如果有人有任何想法,我很想知道!