【问题标题】:Swift: How to determine object type based on the outcome of switch statementSwift:如何根据 switch 语句的结果确定对象类型
【发布时间】:2021-04-02 08:06:18
【问题描述】:

我有一个函数,它返回一个项目是否存在于 3 个 CoreData 实体中的 1 个中,具体取决于传递给该函数的 list: CoreDataList enum 参数:

        static func listContains(word: String, list: CoreDataList) -> Bool {
        var reply = false
        
        switch list {
        case .itemsSearched:
            let request : NSFetchRequest<ItemsSearched> = ItemsSearched.fetchRequest()
        case .itemsAdded:
            let request : NSFetchRequest<ItemsAdded> = ItemsAdded.fetchRequest()
        case .itemsFinished:
            let request : NSFetchRequest<ItemsFinished> = ItemsFinished.fetchRequest()
        }
    
        do {
            request.predicate = NSPredicate(format: "item == %@", word)
            let fetchedResults = try context.fetch(request)
            if fetchedResults.count == 1 {
                reply = true
            }
        } catch {
            print ("fetch task failed", error)
        }
        return reply
    }

这里的问题是 let request 不能在 switch 语句之前初始化,因为它的类型将取决于 switch 的结果。

因此,如果不对每种情况重复整个do catch block,我就找不到执行此功能的方法,这将导致重复相同的代码三次。另一种选择是分成三个不同的函数,但这会带来相同的代码重复问题。

【问题讨论】:

  • 在切换前定义获取请求。

标签: swift xcode core-data


【解决方案1】:

您可以为此创建一个通用函数

static func checkCount<T: NSManagedObject>(word: String, context: NSManagedObjectContext, type: T.Type) -> Bool {
    let request = T.fetchRequest()
    request.predicate = NSPredicate(format: "item == %@", word)
    do {
        let fetchedResults = try context.fetch(request)
        if fetchedResults.count == 1 {
            return true
        }
    } catch {
        print ("fetch task failed", error)
    }
    return false
}

然后从switch内部调用它

case .itemsSearched:
    return checkCount(word: word, context: context, type: ItemsSearched.self)
    

请注意,我将上下文作为参数添加到函数中,因为我不知道它是如何声明的,也许不需要该参数。

【讨论】:

  • 如果我使用在类范围内声明的 'context' 全局变量,应用程序在到达 'do' 块的第一行时会崩溃。我必须像您一样将“上下文”作为参数传递,或者在函数体内声明另一个“上下文”变量才能使其工作。知道为什么吗?
  • 会是零吗?实际上,将上下文作为参数发送并不是一个坏主意,如果您决定更改访问托管对象上下文的方式,它会使代码更具未来性。
猜你喜欢
  • 2015-10-18
  • 2019-04-01
  • 2014-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多