【问题标题】:iOS Core Data: Convert result of fetch request to an arrayiOS Core Data:将获取请求的结果转换为数组
【发布时间】:2020-06-30 01:06:22
【问题描述】:

我正在尝试将获取请求的结果放入数组中。我的代码:

let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
    let managedContext = appDelegate.managedObjectContext
    let fetchRequest = NSFetchRequest(entityName: "CLIENTS")
    var mobClients = [NSManagedObject]()
    var arrayAllPhoneNumbers = [String]()

    do {
        let results = try managedContext.executeFetchRequest(fetchRequest)
        mobClients = results as! [NSManagedObject]

        for clientPhoneNumber in mobClients {

            let myClientPhoneNumber = clientPhoneNumber.valueForKey("clientsMobilePhoneNumber") as! String
            print(myClientPhoneNumber)
            //The numbers print out just fine, one below the other
            //
            //Now the results need to go into the array I've declared above ---> arrayAllPhoneNumbers

            messageVC.recipients = arrayAllPhoneNumbers // Optionally add some tel numbers

        }

    } catch
        let error as NSError {
            print("Could not fetch \(error), \(error.userInfo)")
    }

如图所示,所有电话号码都需要被捕获在一个数组中。我该如何做到这一点?

【问题讨论】:

  • 您最好创建代表核心数据实体的 NSManagedObject 子类,此外,如果您只想要电话号码,您应该在初始获取时使用谓词,然后您可以分配结果电话号码数组。
  • 对于像我这样的 n00b 来说,这是很多(压倒性的)信息!给我一两天的时间来谷歌搜索所有这些,如果你不介意,我想在这方面回复你。同时感谢您的回复!

标签: swift xcode7


【解决方案1】:

用这个代替你的for循环和里面的代码:

arrayAllPhoneNumbers = mobClients.map({ clientPhoneNumber in
    clientPhoneNumber.valueForKey("clientsMobilePhoneNumber") as! String
})
messageVC.recipients = arrayAllPhoneNumbers

【讨论】:

  • 像魅力一样工作!非常感谢!
【解决方案2】:
let request = NSFetchRequest(entityName: "CLIENTS")
let results = (try? managedContext.executeFetchRequest(request)) as? [NSManagedObject] ?? []

let numbers = results.flatMap { $0.valueForKey("clientsMobilePhoneNumber" as? String }

numbers 现在是您的电话号码数组。

但正如 fredelement 所说,最好将其子类化,这样您就可以将其强制转换为该子类并直接访问电话号码。

【讨论】:

    【解决方案3】:

    Swift 5:flatMap 已弃用,请使用 compactMap

    let request = NSFetchRequest(entityName: "CLIENTS")
    let results = (try? managedContext.executeFetchRequest(request)) as? [NSManagedObject] ?? []
    
    let numbers = compactMap { $0.valueForKey("clientsMobilePhoneNumber" as? String }
    

    【讨论】:

      猜你喜欢
      • 2018-08-18
      • 2013-02-17
      • 2011-12-18
      • 1970-01-01
      • 1970-01-01
      • 2020-09-19
      • 1970-01-01
      • 1970-01-01
      • 2014-08-17
      相关资源
      最近更新 更多