标签: swift-data

具有默认值的枚举属性上的 SwiftData 编译器错误

注意: - 这个问题最初是在 Xcode 15 处于测试阶段时发布的。在 Xcode 15 的最终版本中,编译器给出了更清晰的错误说明:

默认值需要完全限定的域名值


原问题:

我已将这个问题缩小到一个简单的模型类,其中一个属性具有枚举类型。如果我尝试为该属性指定默认值,则代码将无法再编译:

enum SomeEnum: Hashable, Codable {
    case one
    case two
}

@Model
class SomeClass {
    var value: SomeEnum = .two

    init() {
    }
}
Run Code Online (Sandbox Code Playgroud)

这会导致错误:

输入“有吗?” 没有成员“二”

如果您深入研究实际日志,您可以看到更多信息:

@__swiftmacro_8Sample39SomeClass5ModelfMm_.swift:15:34:错误:输入“有吗?” 没有成员“二”
    (“值”,\SomeClass.value,.two,nil)
                                ~^~
/.../Sample.swift:117:1: 注意:在宏“模型”的扩展中
类 SomeClass {
^~~~~~~~~~~~~~~~~
/.../Sample.swift:117:1: 注意:在宏“模型”的扩展中
类 SomeClass {
^~~~~~~~~~~~~~~~~

如果右键单击@Model并选择“展开宏”,您会看到:

@__swiftmacro_8Sample39SomeClass5ModelfMm_.swift:15:34: error: type 'Any?' has no member 'two'
    ("value", \SomeClass.value, .two, nil)
                                ~^~~
/.../Sample.swift:117:1: note: in expansion of macro 'Model' here
class …

enums swift swift-data

3
推荐指数
1
解决办法
973
查看次数

SwiftData/PersistentModel.swift:540:致命错误:不支持的关系键路径 ReferenceWritableKeyPath

我有一对多关系 SwiftData 模型。但是,当我尝试附加数据时,会导致错误SwiftData/PersistentModel.swift:540: Fatal error: Unsupported relationship key path ReferenceWritableKeyPath<Student, School>。我应该如何解决这个问题?

@Model
final class School {
  var name: String
  @Relationship(deleteRule: .cascade, inverse: \Student.school)
  var students: [Student] = []

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

@Model
final class Student {
  var fullName: String
  var school: School

  init(fullName: String, school: School) {
    self.fullName = fullName
    self.school = school
  }
}
Run Code Online (Sandbox Code Playgroud)
struct AddStudentToSchoolView: View {
  let school: School
  @Environment(\.modelContext) private var modelContext

  var body: some View {
    // code …
Run Code Online (Sandbox Code Playgroud)

xcode swift swift-data swiftui

3
推荐指数
1
解决办法
773
查看次数

SwiftData:类型“Schema.Relationship.Option”没有成员“cascade”

我们有一个 Swiftdata 模型,例如:

@Model
class MyThing {

   var name:String

   var myObject: MyCustomObject

   //...

}
Run Code Online (Sandbox Code Playgroud)

为了让“myObject”(也是一个 @Model)在删除 MyThing 实例时自动删除,我们需要向 myObject 添加属性(?)、关系(.cascade)。

本教程中显示了这一点:

在此输入图像描述

...还有这个苹果视频:

在此输入图像描述

但是当我尝试这样做时,就会发生这种情况(似乎没有选项可以做到这一点)...如果我手动输入它,它会说找不到:

在此输入图像描述

swift swift-data swift-data-relationship

3
推荐指数
1
解决办法
280
查看次数

以数据块拆分数据并上传到服务器

我有一个文件需要上传到服务器,我被告知在上传之前将文件分成多个块.所以这是一个问题:

1)我已将文件转换为"数据"类型(字节).如何将其拆分为每个1MB的块?
2)拆分后,如何使用Alamofire上传?如果不能使用Alamofire,请推荐我该怎么做.

我正在使用swift 3和Code 8.3.任何帮助深表感谢.

ios alamofire swift-data

2
推荐指数
1
解决办法
1650
查看次数

更新 SwiftData 中的数据

我正在尝试更新 SwiftData 中的数据。然而,该文档实际上只是:

func update(expressions: [String : NSExpression], 
    model: any PersistentModel.Type,
    where predicate: NSPredicate? = nil) throws -> Bool
Run Code Online (Sandbox Code Playgroud)

作为一名新开发人员,我不知道其中大部分意味着什么或如何使用它。我的代码如下:

try? context.update(expressions ["teamScores":NSExpression(format: "\(teamScores)")], model: CounterModel.self)
Run Code Online (Sandbox Code Playgroud)

它失败了exception of type NSException

老实说,我没能尝试太多。截至撰写本文时,这样一个新框架实际上已经在 6 天前发布,除了设置模型、保存数据和查询数据库之外,没有太多文档或示例。

swift swift-data swiftui

2
推荐指数
1
解决办法
7081
查看次数

Foundation/SwiftData 中的 #Predicate 宏是否支持不区分大小写的搜索?

我正在测试新的 SwifData 框架并使用新的 #Predicate 宏,并意识到它不支持不区分大小写的搜索。该宏不能与 lowercased() 方法或 localizedLowercase 属性一起使用,因此似乎无法像我们过去使用 NSPredicate 和 [c] 属性那样创建不区分大小写的谓词。

   var predicate = #Predicate<Book> {
  $0.title.localized().contains(search) }
Run Code Online (Sandbox Code Playgroud)

错误:此谓词不支持 lowercased() 函数(来自宏“Predicate”)

我想知道是否有任何解决办法。谢谢

predicate swift swift-data

2
推荐指数
1
解决办法
818
查看次数

Swift数据关系

我正在使用新的 swiftData 我试图理解这些关系是如何工作的,我很高兴必须对类进行建模:

我的应用程序上的每个航班都包含许多机组人员,我编写了如下代码所示的关系,但不断收到错误“致命错误:反向关系不存在”

我们应该如何写这个关系:

@Model
class Flight {
    @Attribute(.unique) var flightID: UUID
    var typeOfFlight: String
    var flightDateUTC : Date
    var flightNumber: String?
    
    @Relationship(.cascade) var flightData: FlightData
    @Relationship(.cascade) var flightTime : FlightTime
    @Relationship(.noAction) var aircraft : Aircraft?
    @Relationship(inverse: \CrewModel.name)
    var crews : [CrewModel]? //<-------------------------------
    
    init(flightID: UUID, typeOfFlight: String, flightDateUTC: Date, flightNumber: String? = nil, flightData: FlightData, flightTime: FlightTime, aircraft: Aircraft? = nil, crews: [CrewModel]? = nil) {
        self.flightID = flightID
        self.typeOfFlight = typeOfFlight
        self.flightDateUTC = flightDateUTC
        self.flightNumber = flightNumber
        self.flightData …
Run Code Online (Sandbox Code Playgroud)

swift swift-data

2
推荐指数
1
解决办法
1931
查看次数

设置关系时的 SwiftData EXC_BREAKPOINT

我是第一次使用 SwiftData,当我尝试设置关系的值时遇到崩溃问题。

我有一个Profession代表游戏中工作的对象。每个人都Profession可能有开支(Expense如抵押贷款)。

我试图在应用程序首次启动时填充初始数据。当我创建第一个时Profession,我创建了一个Expense似乎可以工作的项目,但是当我创建第二个时,Expense应用程序Thread 1: EXC_BREAKPOINT (code=1, subcode=0x1c3c6203c)在尝试设置Expense.profession关系时崩溃了。Xcode 扩展profession属性以显示 get/set,但它在 set 函数中崩溃。

我错过了一些明显的东西吗?或者 SwiftData 是否期望我做一些与 CoreData 在这种情况下非常不同的事情?

@Model
class Profession {
    var id: UUID
    var name: String
    
    @Relationship(deleteRule: .cascade, inverse: \Expense.profession) var expenses: [Expense] = []
        
    init(name: String) {
        self.id = UUID()
        self.name = name
    }
    
    convenience init(professiondefault: ProfessionDefault) {
        self.init(name: professiondefault.name)
        
        let taxes = Expense(name: "Taxes", cashflow: professiondefault.taxes, isPermanent: true, profession: …
Run Code Online (Sandbox Code Playgroud)

swift-data

2
推荐指数
1
解决办法
566
查看次数

SwiftData 搜索栏和谓词

我正在尝试使用带有搜索栏的 SwiftData 框架创建一个视图,用户可以在其中输入飞机的注册信息并动态更新列表。但首先我不确定我是否正确执行(我在网上找不到太多示例)并且收到错误:

通用结构“ForEach”要求“Query<Aircraft, [Aircraft]>”符合“RandomAccessCollection”

struct AirplanePick: View {
    @State var addNewPlane = false
    @Environment (\.modelContext) var mc
 
    @Binding var planePick: Aircraft?
    let dm: DataManager
    @Environment(\.presentationMode) var presentationMode

    @State var searchTerm: String = ""
    
    var filterPlanes : Query<Aircraft, [Aircraft]>{
       
        var predicate: Predicate<Aircraft>?
        
        if !searchTerm.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty {
            predicate = .init(#Predicate { $0.registration.contains(searchTerm) })
        }
        
        return Query(filter: predicate, sort: \.registration)
    }
    var body: some View {
        
        List {
            Text("planes are \(planes.count)")
            
            ForEach(filterPlanes, id: \.self){ plane in
                             
                
                Button {
                    planePick = plane
                 
                    self.presentationMode.wrappedValue.dismiss() …
Run Code Online (Sandbox Code Playgroud)

predicate swift-data swiftui

1
推荐指数
1
解决办法
1134
查看次数

SwiftData:非法尝试在不同上下文中的对象之间建立关系

我有 2 个漂亮的模型,想为它们创建一些虚拟预览数据,但我遇到了错误:

非法尝试在不同上下文中的对象之间建立“人”关系

错误发生在这里:

@MainActor
let previewContainer: ModelContainer = {
    do {
        let container = try ModelContainer(
            for: Person.self, Item.self,
            configurations: ModelConfiguration(isStoredInMemoryOnly: true)
        )
        let person = Person.dummy()
        container.mainContext.insert(person)
        for i in 0 ..< 12 {
            let item = Item.dummy(i, person: person) //ERROR!
            container.mainContext.insert(item)
        }
        return container
    } catch {
        fatalError("Failed to create container \(error)")
    }
}()
Run Code Online (Sandbox Code Playgroud)

我正在使用 Xcode 15 beta 8。知道我做错了什么吗?

以下是我的模型供参考:

项目型号

@Model
final class Item {
    var note: String
    var person: Person

    init(note: String, person: …
Run Code Online (Sandbox Code Playgroud)

swift swift-data

1
推荐指数
1
解决办法
579
查看次数