使用kotlin Multiplatform Mobile将Swift的struct对象集映射到kotlin的数据类集.



例如,我在kotlin中有这个简单的业务代码:

class ProjectItemFacade(
val projects: Set<ProjectEntity>
) {
fun sortedProjects(): List<ProjectEntity> {
return projects.toList().sortedBy { it.name }
}
}
data class ProjectEntity(
val id: String,
val name: String,
val description: String
)

我试着像这样从Swift调用它:

struct ProjectItem: Identifiable, Codable, Hashable {
var id = UUID().uuidString
let name: String
let description: String
}
let projects: Set = [
ProjectItem(name: "Zero Project", description: "test1"),
ProjectItem(name: "First Project", description: "test2"),
ProjectItem(name: "Third Project", description: "test3"),
]

let sortedProjects = ProjectItemFacade(projects: projects).sortedProjects()

但是它给了我一个错误:

Cannot convert value of type 'Set<ProjectItem>' to expected argument type 'Set<ProjectEntity>'
Cannot use instance member 'projects' within property initializer; property initializers run before 'self' is available

似乎有一个问题映射Swift结构到kotlin数据类。如何解决?

编辑

在将kotlin类重命名为与swift相同后,它返回的第一个错误如下:

Cannot convert value of type 'Swift.Set<iosApp.ProjectItem>' to expected argument type 'Swift.Set<shared.ProjectItem>'

正如@Sweeper在评论中所说,我应该在我的swift代码中使用kotlin类。我决定像这样映射我的数组:

import Foundation
import shared
struct ProjectItem: Identifiable, Codable, Hashable {
var id = UUID().uuidString
let name: String
let description: String

func toEntity() -> ProjectEntity {
ProjectEntity(id: id, name: name, description: description)
}

static func fromEntity(_ entity: ProjectEntity) -> ProjectItem {
ProjectItem(id: entity.id, name: entity.name, description: entity.description_)
}
}

注意,我使用entity.description_,因为它看起来像description属性调用数据类toString()方法。

let projects: Set = Set(
[
ProjectItem(name: "Zero Project", description: "test1"),
ProjectItem(name: "First Project", description: "test2"),
ProjectItem(name: "Third Project", description: "test3"),
]
.map { $0.toEntity() }
)

var sortedProjects: Array<ProjectEntity> {
get {
return ProjectItemFacade(projects: projects)
.sortedProjects()
}
}

Computedget解决了第二个错误。

最新更新