SwiftData IOS 17 数组以随机顺序排列?

10
为什么当我使用@Model宏时,我的数组的顺序是随机的?
class TestModel {
var name: String?
var array: \[TestModel2\]

    init(name: String = "") {
        self.name = name
        array = []
    }

}

class TestModel2 {
var name: String?

    init(name: String = "") {
        self.name = name
    }

}

这个工作很好,array中的所有项目都按照我添加的顺序排列。
但是如果我将它们都声明为@Model,像这样:

@Model
class TestModel {
var name: String?
var array: \[TestModel2\]

    init(name: String = "") {
        self.name = name
        array = []
    }

}

@Model
class TestModel2 {
var name: String?

    init(name: String = "") {
        self.name = name
    }

}

数组项总是以随机顺序排列。当我重新加载显示它们的视图或向数组添加项时,顺序会被随机化。
这种行为也可以在示例代码这里中看到。 当将待办清单项添加到旅行中时,这些项总是以随机顺序显示。
这是一个测试版的错误吗?还是有意为之?

不确定您在模型中定义了什么,通常当两个模型相互连接时会使用@Relationship - undefined
根据文档,@Relationship只需要用于指定自定义的删除规则。"当一个模型包含一个类型也是模型(或者一组模型)的属性时,SwiftData会隐式地为你管理这些模型之间的关系。默认情况下,框架在删除相关的模型实例后将关系属性设置为nil。要指定不同的删除规则,请使用Relationship(::originalName:inverse:hashModifier:)宏来注释属性。" 当我在模型中添加@Relationship时,对结果没有任何影响。 - undefined
3
我一定错过了那部分,太好了,这将简化事情。SwiftData在底层使用Core Data,而Core Data在对多关系属性上使用Set,所以很可能是这个原因导致你的数组属性一直变换顺序。 - undefined
我也遇到了同样的问题,所以在获取数据时,我使用了时间戳并根据它们对数据进行排序。 - undefined
1
@user11640506 如果你在TestModel上有一个查询,你如何对TestModel2进行排序? - undefined
@user11640506 看起来这似乎是唯一的解决方案,但它并不合理,因为在添加新数据后,排序顺序会发生变化,很容易出错。 - undefined
1个回答

2
我遇到了同样的问题。就像其他人在评论中说的那样,我不得不给我的SwiftData模型添加一个时间戳,并按照时间戳进行排序。这一定是个bug或者其他什么问题。
@Model
final class YourObject {
    let timestamp: Date
    // Other variables
}

然后在你的视图中,你可以像这样做:
@Query private var yourObjects: [YourObject]

List {
    ForEach(yourObjects.sorted(by: {$0.timestamp < $1.timestamp})) { object in 
        // Other code here
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接