swift extension func with generic type - isEmpty for FetchedResults

时间:2018-04-15 16:56:05

标签: swift generics

我在实现扩展功能时遇到了一些问题,无法确定实体是否包含任何结果。最终目标是确定某个实体是否有结果,如果没有,则在应用启动时将其播种(对于某些实体,如国家/地区列表等)

这是我能够获得的地方,但是swift编译器并不开心;错误:类型'T'不符合协议'NSFetchRequestResult'

extension NSManagedObject {
    func isEmpty<T>(context: NSManagedObjectContext, entityName: String, entityType: T.Type) -> Bool {
        do {
            let fetch = NSFetchRequest<T>(entityName: entityName)
            let count = try context.fetch(fetch)
            return count == 0 ? true : false
        } catch {
            return true
        }
    }
}

1 个答案:

答案 0 :(得分:1)

您必须将T限制为NSManagedObject子类。 如果您只对count(for:)感兴趣,也应该使用func isEmpty<T: NSManagedObject>(context: NSManagedObjectContext, entityName: String, entityType: T.Type) -> Bool { do { let fetch = NSFetchRequest<T>(entityName: entityName) let count = try context.count(for: fetch) return count == 0 } catch { return true } } 对象数量:

func isEmpty(context: NSManagedObjectContext, entityName: String) -> Bool {
    do {
        let fetch = NSFetchRequest<NSFetchRequestResult>(entityName: entityName)
        let count = try context.count(for: fetch)
        return count == 0
    } catch {
        return true
    }
}

但实际上你并不需要这个参数:

        fetch.fetchLimit = 1

作为性能改进,您还可以设置

return someBooleanCondition ? true : false

备注:声明

return someBooleanCondition

可以(并且应该)始终简化为

public MyClass() {
    // set variables initial default value if any or leave empty
}