Swift 谓词在字符串数组的 Swift 数据中不起作用

问题描述 投票:0回答:1

在 Swift Data 中我有一个基本模型

@Model class MovieSD {
 
    @Attribute(.unique) var title: String
    var genre: [String] = [String]()
    
    init(title: String) {
        self.title = title
    }
    
}

我试图在获取数据时创建谓词。创建按标题搜索的谓词按预期工作

let movieTitle = #Predicate<MovieSD> { movie in
    movie.title.contains("filterstring")
}

但是当尝试对字符串数组执行相同操作时

let movieGenre = #Predicate<MovieSD> { movie in
    movie.genre.contains("filterstring")
}

导致 EXC_BAD_ACCESS 崩溃

类似的方法会产生不同的错误并指出可能的问题。

let movieGenre2 = #Predicate<MovieSD> { movie in
    if movie.genre.contains(where: { $0 == "filterstring" }) {
         return true
    } else {
        return false
    }
}

导致崩溃并出现错误:

error: SQLCore dispatchRequest: exception handling request: <NSSQLFetchRequestContext: 0x281a96840> , Can't have a non-relationship collection element in a subquerySUBQUERY(genre, $$_local_1, $$_local_1 == "SciFi") with userInfo of (null)

或者大致相同的错误:

let movieGenre3 = #Predicate<MovieSD> { movie in
    movie.genre.filter { genre in
        return genre == "filterstring"
    }.count > 0
}

看来 Swift Predicate 应该能够使用 NSPredicate 来创建依赖于 SUBQUERY 的条件语句。但在这种情况下,它似乎不太有效。

当然,我可以使用类似于上面的方法来过滤返回的数组。但这似乎效率很低。而且看起来应该可以过滤。另外,我想避免将流派数组放入 @model Genre 类的方法。

任何显示如何使用 Swift Data 的谓词过滤字符串数组的帮助将不胜感激。

ios arrays swift predicate swiftdata
1个回答
0
投票

如果它适合您的应用程序,您可以将流派存储在不同的表中并对其进行查询。

@Model class Genre {
    @Attribute(.unique) var name: String
    
    init(name: String) {
        self.name = name
    }
    
}
@Model class MovieSD {
    @Attribute(.unique) var title: String
    var genre = [Genre]()
    
    init(title: String) {
        self.title = title
    }
    
}

这篇文章可以帮助解释为什么会发生这种情况。

如果您使用值类型的集合,例如[String],SwiftData 也会将其直接保存在单个属性中。现在它被编码为二进制属性列表数据,这意味着您不能在谓词中使用数组的内容。

© www.soinside.com 2019 - 2024. All rights reserved.