我尝试使用FilterDescriptor创建一个泛型函数来过滤数组(类似于本文中描述的SortDescriptors:http://chris.eidhof.nl/post/sort-descriptors-in-swift/)。 基本上,过滤后的元素应该包含在过滤器中的任何集合中。我遵循这种方法,因为需要在运行时选择过滤器,并且可以将它们组合在一起。
但是我在构造filterFunction()时遇到了这个错误:
错误:无法转换类型' String'的值关闭结果类型' _'
case .grade:return filterDescriptor(key:{$ 0.grade},set:gradeFilters)
错误:无法转换类型' Int'关闭结果类型' _'
case .term:return filterDescriptor(key:{$ 0.term},set:termFilters)
这是我的代码:
struct Note {
let grade: String
let term: Int
}
typealias FilterDescriptor<Value> = (Value) -> Bool
class Filter {
var gradeFilters: Set<String> = []
var termFilters: Set<Int> = []
enum Option: Int {
case grade, term
private func filterDescriptor<Value, Key>(
key: @escaping (Value) -> Key,
set: Set<Key>)
-> FilterDescriptor<Value> {
return { set.contains(key($0)) }
}
func filterFunction() -> FilterDescriptor<Note> {
switch self {
case .grade: return filterDescriptor(key: { $0.grade }, set: gradeFilters)
case .term: return filterDescriptor(key: { $0.term }, set: termFilters)
}
}
}
}
let notes = [Note(grade: "F grade", term: 10), Note(grade: "A grade", term: 3)]
// Filter by grade
let filter = Filter.Option.grade.filterFunction()
let filteredNotes = notes.filter(filter)
我认为与Set&lt; Key&gt;有关。 filterDescriptor方法中的参数和错误消息不是