0

我在一个新的 Kotlin Multiplatform 移动项目中工作,我无法将 Kotlin 接口实现到 Swift 类中。

这是我的设置:

从 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项目可以看到生成的通用框架,我可以跳转到框架内的类/协议定义

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

类型“DBUserSource”不符合协议“LocalUserSource”

当我在 Xcode 中使用“修复”选项时,它会不断重复该方法并显示相同的错误。我已经尝试了所有方法来清理 android studio(我正在运行 gradle build)和 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;
4

2 回答 2

2

suspend fun readUser(): User?在您的 Kotlin 代码中是可空的,而您在 Swift 等效函数签名中使用不可空/非可选类型:

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
}

于 2021-11-11T08:14:48.547 回答
0

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

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。但是,如果有人有任何想法,我很想知道!

于 2021-11-12T04:21:11.150 回答