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