小编Kha*_*euh的帖子

Swift 中的 KMM 泛型:强制 KMM Any 为 Swift Any 而不是 AnyObject

我目前正在开发一个用 Swift 实现的 KMM 库。所以我对泛型有一些不太理解的地方。

我有我的 KMM 通用类:

class Foo<T> {
 ...
}
Run Code Online (Sandbox Code Playgroud)

然后,我可以在 KMM 中毫无问题地使用它,例如像这样

var bar = Foo<List<SomeClass>>()
Run Code Online (Sandbox Code Playgroud)

原来的问题:

当我在 swift 中使用它时,这有点不同,因为当我将 KMM 库编译为 Swift 框架时,我的类现在以这种方式声明:

public class Foo<T> : KotlinBase where T : AnyObject {
 ...
}
Run Code Online (Sandbox Code Playgroud)

在这里,我无法像在 KMM 中那样将它与数组一起使用,因为 Swift 数组不是 Any,而是 AnyObject。例如:

var bar = Foo<[SomeClass]>()
Run Code Online (Sandbox Code Playgroud)

然后我收到错误:

“Foo”要求“[AnyObject]”是类类型

问题:

是否可以强制执行某些操作,以便 KMM Any 在 Swift 中被解释为 Any 而不是 AnyObject,或者这个问题还有其他解决方案吗?

编辑:

正如亚历山大所说:

可能没有办法解决这个问题。从根本上说,除了少数硬编码到平台中的原语之外,JVM 缺乏一种表达就地分配的值类型(如 Swift 的结构或枚举)的方法。

所以我尝试在 KMM 中重载 Foo,如下所示:

class ListFoo<T>() : Foo<T>() where …
Run Code Online (Sandbox Code Playgroud)

generics ios swift kotlin-multiplatform

6
推荐指数
0
解决办法
962
查看次数

标签 统计

generics ×1

ios ×1

kotlin-multiplatform ×1

swift ×1