使用泛型函数对数组进行排序会在闭包结果类型上引发错误

时间:2017-10-31 23:18:44

标签: swift generics set swift-protocols

我尝试使用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方法中的参数和错误消息不是

0 个答案:

没有答案