例如,我在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
解决了第二个错误。