let startDate: Date = Date()
let predicate = #Predicate<Trip> { session in
session.startTime >= startDate
}
Run Code Online (Sandbox Code Playgroud)
当 #Predicate 在 Date 上不起作用时,有人遇到这个问题吗?我收到不支持的谓词错误。有什么想法要解决吗?
我正在 Xcode 15(测试版)中迁移到 SwiftData,并且很难弄清楚如何在我的一对多模型中形成谓词。期望的结果是返回一个查询,该查询仅返回文章“搜索”字段包含用户正在搜索的字符串的文章和部分。
这是我当前的模型:
@Model
class SectionsSD {
@Attribute(.unique) var id: String
var section: String
var rank: String
var toArticles: [ArticlesSD]?
init(id:String, section: String, rank: String) {
self.id = id
self.section = section
self.rank = rank
}
}
@Model
class ArticlesSD {
var id: String
var title: String
var summary: String
var search: String
var section: String
var body: String
@Relationship(inverse: \SectionsSD.toArticles) var toSection: SectionsSD?
init(id: String, title: String, summary: String, search: String, section: String, body: String) {
self.id …Run Code Online (Sandbox Code Playgroud) 我一直在尝试很多方法来解决这个问题。我正在尝试使用谓词获取 SwiftData 记录。但我尝试的一切都会导致两个错误:
初始化程序“init(_:)”要求“Item”符合“Encodable”
初始化程序“init(_:)”要求“Item”符合“Decodable”
该错误来自扩展#Predicate宏内部。
这是一个简单的类来演示这个问题:
@Model
final class Item {
@Attribute(.unique) var id: String
var timestamp: Date
init(timestamp: Date) {
self.id = UUID().uuidString
self.timestamp = timestamp
}
}
Run Code Online (Sandbox Code Playgroud)
这是导致编译器问题的基本代码:
extension Item {
static func foo() {
let item = Item(timestamp: .now)
let pred = #Predicate<Item> { $0.id == item.id }
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试了很多方法来解决这个错误。我见过的 Apple SwiftData 示例项目都没有出现此错误。
我尝试过遵守Identifiable. 我已经重新命名了该id属性。我已将id类型更改为UUID直接而不是String.
当然,我添加了代码以符合Codable. 虽然这修复了编译器错误,但我最终遇到了运行时错误。请注意,Apple SwiftData 项目的模型均不符合Codable. …
我的应用程序及其小部件之间共享一个应用程序组。
我有 SwiftData 的 @Model,从小部件意图的perform()方法更新并显示在应用程序和小部件上。
@MainActor
func perform() async throws -> some IntentResult {
let context = try ModelContainer(for: MyModel.self).mainContext
let myModel = try ModelContainer(for: MyModel.self).mainContext.fetch(
FetchDescriptor<MyModel>(predicate: #Predicate {
// The predicate is not the problem.
})
).first
myModel?.functionThatModifiesMyModel()
return .result()
}
Run Code Online (Sandbox Code Playgroud)
应用程序和小部件 SwiftUI 都使用宏查看对模型的访问。
@Environment(\.modelContext) var context
@Query(sort: \.whatever) var myModel: [MyModel]
Run Code Online (Sandbox Code Playgroud)
但应用程序代码中的数据永远不正确(使用意图正确更新小部件的数据)。
为什么模型没有出现在应用程序中?
我在我的项目中使用 SwiftData。在模拟器中的 Xcode 15 beta 4 下一切正常。自从我更改为 Xcode 15 beta 5 以来,我多次收到以下错误:
CoreData:错误:此应用程序中的一个或多个模型正在使用可转换属性,其转换器名称要么未设置,要么设置为 NSKeyedUnarchiveFromDataTransformerName。请改用“NSSecureUnarchiveFromData”或 NSSecureUnarchiveFromDataTransformer 的子类。在某些时候,当指定 nil 时,Core Data 将默认使用“NSSecureUnarchiveFromData”,并且包含不支持 NSSecureCoding 的类的可转换属性将变得不可读。“NSKeyedUnarchiveFromData”不应用于取消存档,并将在未来版本中删除
我知道这是底层 CoreData 设置中的错误。但是,如何更改 CoreData 配置?如果您直接使用 CoreData,您可以更改配置,但是当您使用 SwiftData 时,如何更改配置。为什么苹果不从一开始就使用正确的配置?
我正在使用定义我的模型的标准代码:
@Model final class LoggerItem {
@Attribute(.unique) let id: UUID
var title: String
var created: Date
var modified: Date?
...
}
Run Code Online (Sandbox Code Playgroud)
这已经创建了上述错误消息。
我有以下型号:
@Model
class Game {
var name: String
var firstReleasedOn: Date?
@Relationship(deleteRule: .cascade, inverse: \QueueEntry.game)
var queueEntry: QueueEntry?
init(
name: String,
firstReleasedOn: Date?
) {
self.name = name
self.firstReleasedOn = firstReleasedOn
}
}
Run Code Online (Sandbox Code Playgroud)
@Model
public class QueueEntry {
var game: Game?
var createdOn: Date
var order: Int
init(order: Int) {
self.createdOn = .now
self.order = order
}
}
Run Code Online (Sandbox Code Playgroud)
我想用List按游戏发布日期排序的所有条目填充 a ,因此我有以下内容:
struct QueueView: View {
@Query(sort: [SortDescriptor(\QueueEntry.game?.firstReleasedOn)])
private var entries: [LocalData.QueueEntry]
var body: some View {
List(entries) { …Run Code Online (Sandbox Code Playgroud) 我希望能够膨胀/收缩Swift3数据结构.我找到了GzipSwift,但目前尚不清楚我是如何将其提供给我的iOS应用程序的.我试过的天真的事情包括:
将Data+Gzip.swift文件复制到我自己的项目中.然后抱怨import zlib所述文件的顶部.我认为这与相同源的zlib目录中的modulemap文件有关.但是我不确定在我自己的项目中重建那些内容或者如何重建这些内容.
从github克隆存储库,打开XCode并内置(基本上按下了运行按钮).然后尝试将其作为链接库或框架添加到我自己的项目中.我很确定只选择存储库的顶级目录不是我想做的,但我不知道还有什么可以尝试.
我已经找到了一些其他的代码,但它似乎过时并且相对于Swift2.
我正在尝试了解新的 SwiftData 框架。只要我在 SwiftUI 视图中完成所有操作,就很容易让它工作。我试图成为一名优秀的编码员并将数据与 UI 分开,但无法连接到 ModelContainer 并且 ModelContext 是一个类文件。
这是一个可以按原样运行的示例:
模型:
@Model
final public class Thing: Identifiable {
let myID = UUID()
var name: String
var comment: String
init(name: String, comment: String) {
self.name = name
self.comment = comment
}
}//struct
Run Code Online (Sandbox Code Playgroud)
ContentView:更改Button中的代码以创建10条测试记录以使用VM版本。
struct ContentView: View {
@StateObject var contentVM = ContentViewModel()
@Environment(\.modelContext) private var context
@State private var name: String = ""
@State private var comment: String = ""
@State private var selection: Thing?
@Query(sort: \.name) var things: …Run Code Online (Sandbox Code Playgroud) 我在视图上有一个函数,该函数具有modelContext其环境并且可以成功地将数据添加到模型容器。但是,当在同一个函数中我尝试运行Query()函数调用时,我在控制台上收到以下消息:
Set a .modelContext in view's environment to use Query
Run Code Online (Sandbox Code Playgroud)
知道我可能做错了什么吗?代码基本上是这样的:
Set a .modelContext in view's environment to use Query
Run Code Online (Sandbox Code Playgroud) 我是 SwiftUI 的新手,对于我的第一个应用程序,我决定尝试 SwiftData,因为我不想稍后将其转换为 SwiftData。我的应用程序有计时器(MyTimer),每个计时器都有一个名称和几个重置,每个重置都有一个日期和一个文本字符串。我希望用户能够选择 MyTimer 并查看其重置列表,然后从那里能够编辑或删除其中的任何一个。因此,我的第一个视图允许创建 MyTimer 并向其添加重置。第二个视图显示所选 MyTimer 的重置列表。
我遇到的问题是,当我删除多个重置时,重置数组似乎没有更新,如果您从列表的同一行删除第二个重置,它会尝试删除已删除的重置,并且我收到错误:线程 1:致命错误:此方法不准备对脱离其托管对象上下文的支持数据进行操作。关系需要通过 objectID 进行深度复制才能发挥作用。
这是应用程序数据模型文件的代码:
import Foundation
import SwiftData
import SwiftUI
@Model
final class MyTimer {
var id: String
var name: String
@Relationship(deleteRule: .cascade)
var resets: [Reset]
@Transient
var sortedResets: [Reset] {
print(resets.count)
return self.resets.sorted { $0.date > $1.date }
}
init(_ name: String = "",
startDate: Date = .now) {
let id = UUID().uuidString
self.id = id
self.name = name
self.resets = [Reset(text: "Started On", date: startDate)]
} …Run Code Online (Sandbox Code Playgroud)