有谁知道如何在 SwiftUI 中使用 swiftdata 和 CloudKit 在其他用户之间共享数据并设置权限?谢谢你!
\n我检查了 apple\xe2\x80\x99s 文档以及互联网。我\xe2\x80\x99m不确定\xe2\x80\x99s甚至支持\xe2\x80\xa6
\n我想创建一个类来定期处理一些数据。我没有使用过CoreData。在 SwiftUI 视图之外,如何获取模型容器和上下文以便检索和添加对象?WWDC 视频中显示的代码let context = self.newSwiftContext(from: Trip.self)并不是不言自明的。
我正在替换 iOS 应用程序中的一些 CoreData 代码以使用新的 SwiftData 框架。在我的原始代码中,我将 CoreData 对象 URI 保存在 UserDefaults 中作为快速书签。这使我能够轻松地直接获取我需要的特定对象。
例如
model.objectID().uriRepresentation().absoluteString
Run Code Online (Sandbox Code Playgroud)
在研究 SwiftData 解决方案时,我在 SwiftData 模型上发现了这个objectID属性,它的类型是PersistentIdentifier,它似乎可以满足我的要求。但似乎没有一种直接的方法来为这个值添加书签。PersistentIdentifier符合“Codeable”,我可以通过将其转换为 来保存到 UserDeafaults Data,但是当我尝试这样做时,返回的值不包含任何必要的数据,只是一个空值。这是在id对objectIDModel 对象进行编码时创建的。
"{\"implementation\":{}}"
Run Code Online (Sandbox Code Playgroud)
如何使用新的 SwiftData 框架来实现这一目标?
我正在尝试在基于 SwiftData 的 SwiftUI 项目中使用多个视图。但是,当我在另一个视图中为 SwiftData @Model 对象创建参数时,当我在 #Preview 中创建该对象的示例时,编译器开始抱怨未在 @Model 对象中实现协议。
Xcode 15 测试版 2
我从一个新的 iOS SwiftData 项目开始。我像这样更新了 ContentView:
import SwiftUI
import SwiftData
struct ContentView: View {
@Environment(\.modelContext) private var modelContext
@Query private var items: [Item]
@State private var selection: Item?
var body: some View {
NavigationSplitView {
List(selection: $selection) {
ForEach(items) { item in
Text(item.timestamp, format: Date.FormatStyle(date: .numeric, time: .standard))
}
.onDelete(perform: deleteItems)
}
.toolbar {
ToolbarItem(placement: .navigationBarTrailing) {
EditButton()
}
ToolbarItem {
Button(action: addItem) {
Label("Add …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用新的#Predicate宏获取一些结果。enum当我尝试使用谓词内的属性时,就会出现问题。有谁知道这是否可以完成或者这是否是一个错误?
XCode 15 测试版 4
获取1:
let predicate = #Predicate<ModelA> { $0.type == ModelA.ModelAType.a }
Run Code Online (Sandbox Code Playgroud)
获取2:
let predicate = #Predicate<ModelA> { $0.type.rawValue == ModelA.ModelAType.a.rawValue }
Run Code Online (Sandbox Code Playgroud)
模型:
@Model final class ModelA: Codable {
@Attribute(.unique) var id: Int64 = 0
enum ModelAType: Int, CaseIterable, Codable { case a = 1, b }
var type: ModelAType = ModelAType.a
}
Run Code Online (Sandbox Code Playgroud)
错误:
类型“ModelA.Type”无法符合“StandardPredicateExpression”
类型“ModelA.Type”无法符合“PredicateExpression”
无法从上下文推断关键路径类型;考虑显式指定根类型
我正在尝试使用 and/or 组合该类型的多个谓词。以前使用 CoreData 和 NSPredicate 我只会这样做:
let predicate = NSPredicate(value: true)
let predicate2 = NSPredicate(value: false)
let combinedPred = NSCompoundPredicate(type: .or, subpredicates: [predicate, predicate2])
Run Code Online (Sandbox Code Playgroud)
是否有类似的方法可以使用 SwiftData 和 #Predicate 来做到这一点?如果没有,我如何实现一种预先创建部分条件并稍后将它们组合到谓词中的方法?
我发现将其作为表达式执行此操作的唯一方法是这样的,但这将使我的谓词长数百行
let includeOnlyFavorites = true
#Predicate { includeOnlyFavorites ? $0.isFavorite : true }
Run Code Online (Sandbox Code Playgroud)
我正在开发一个应用程序,允许用户使用快捷操作保存和查询项目。这些项目使用 SwiftData 存储并使用 EntityPropertyQuery 查询
Apple 是这样实现 Query 属性的:
static var properties = QueryProperties {
Property(\BookEntity.$title) {
EqualToComparator { NSPredicate(format: "title = %@", $0) }
ContainsComparator { NSPredicate(format: "title CONTAINS %@", $0) }
}
}
Run Code Online (Sandbox Code Playgroud)
然后将谓词与 …
我有以下代码:
import SwiftUI
import SwiftData
struct ContentView: View {
@Environment(\.modelContext) private var modelContext
var schoolClass: SchoolClass
var body: some View {
VStack {
Image(systemName: "globe")
.imageScale(.large)
.foregroundStyle(.tint)
Text("Hello, world!")
Button("add", action: {
let schoolClassSubject = SchoolClassSubject(schoolClass: schoolClass)
schoolClass.schoolClassSubjects.append(schoolClassSubject)
})
}
.padding()
}
}
@Model
class SchoolClass {
var name: String
var schoolClassSubjects: [SchoolClassSubject] = []
init(name: String) {
self.name = name
}
}
@Model
class SchoolClassSubject {
var schoolClass: SchoolClass
init(schoolClass: SchoolClass) {
print("test")
self.schoolClass = schoolClass
}
}
Run Code Online (Sandbox Code Playgroud)
schoolClass …
swift 中数据类型 Int 和 UInt8 之间有什么区别?
看起来 UInt8 用于二进制数据,我需要将 UInt8 转换为 Int 这是可能的。
import Foundation
import SwiftData
@Model class Example: {
let name: String
let type: String
init(name: String, type: String) {
self.name = name
self.type = type
}
}
//Then in the View
@Query var doors: [Door]
Run Code Online (Sandbox Code Playgroud)
SwiftData 是 Apple 在 WWDC 20223 上推出的新框架,这可能是一个愚蠢的问题,但我似乎无法在这里找到最佳实践。我可以让用户添加示例,但我看不到如何在代码级别添加它们。
extension Example {
static let examples: [Example] = [
Example(
name: "ex1",
type: "red"
),
Example(
name: "ex2",
type: "blue"
)
]
}
Run Code Online (Sandbox Code Playgroud)
我尝试使用扩展名预加载数据,但没有传递到视图。任何帮助都会很棒!
不幸的是,使用 CloudKit 时,该.unique属性不可用于 SwiftData 模型属性。是否有最佳实践为我自己的模型设置这样的约束?
对于本地数据库,在创建和插入新模型之前获取(和过滤)模型是相当简单的。
但是如何防止来自其他设备的模型重复 - 即,在从 CloudKit 导入时将重复的模型与本地现有的模型合并,然后将它们插入到本地 SwiftData DB 中?
swift-data ×10
swift ×6
swiftui ×3
cloudkit ×2
int ×1
ios ×1
nspredicate ×1
persistence ×1
predicate ×1
sharing ×1
xcode15 ×1