具有通用类型的快速扩展函数 - isEmpty for FetchedResults

标签 swift generics

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

这是我能够得到的地方,但是 swift 编译器不满意;错误:类型“T”不符合协议(protocol)“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
        }
    }
}

最佳答案

您必须将 T 限制为 NSManagedObject 子类。 如果您只对 对象数量:

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

关于具有通用类型的快速扩展函数 - isEmpty for FetchedResults,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49844507/

相关文章:

swift - 二元运算符 < 不能应用于 Swift 中的 Clong

swift - 创建不安全通用指针时出现语法错误(无法推断通用参数 'Pointee')

java - 具有其他类型 Collection getter 的泛型类

iOS - 容器 View Controller Swift

ios - 从一个 View Controller 转到不同的 Controller

java - 如何调用不带参数的泛型方法?

generics - Kotlin 中具有泛型类型的 Lambda val

java - 向上转换不会导致类型删除吗?

ios - 在 iOS 中创建另一个 View 的图像

ios - 具有图像背景和模糊效果的 TableView - swift