从 NSFetchRequest 将字典数组转换为值数组

Posted

技术标签:

【中文标题】从 NSFetchRequest 将字典数组转换为值数组【英文标题】:Convert Array of Dictionaries into Array of Values from NSFetchRequest 【发布时间】:2017-12-04 19:18:10 【问题描述】:

我有一本使用fetchRequest.resultType = .dictionaryResultTypeNSFetchRequest 返回的字典,返回的字典是[Any],如下所示:

teams [
    team = Canadiens;
, 
    team = "Maple Leafs";
, 
    team = Penguins;
]

我只想要一个值数组,比如[Canadiens, "Maple Leafs", Penguins"],如何将字典数组转换为只包含值的数组?

全取

func teamNames(managedContext: NSManagedObjectContext) 
    //print("\(self) -> \(#function)")

    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Players")

    fetchRequest.fetchBatchSize = 8
    fetchRequest.propertiesToGroupBy = [#keyPath(Players.team)]
    fetchRequest.propertiesToFetch   = [#keyPath(Players.team)]
    fetchRequest.resultType          = .dictionaryResultType

    do 

        let fetchTeamNamesDictionary = try managedContext.fetch(fetchRequest)
        print("fetchTeamNamesDictionary \(fetchTeamNamesDictionary)")


     catch let error as NSError 

        print("GoFetch|teamNames: Could not fetch. \(error), \(error.userInfo)")
    



替代接受的答案:

do 

    let fetchTeamNamesArray = try managedContext.fetch(fetchRequest)

    for array in fetchTeamNamesArray 

        let teamName = (array as AnyObject).value(forKey: "team") as! String

        teamNameArray.append(teamName)

    

【问题讨论】:

【参考方案1】:

正如您清楚地知道结果的键和值是字符串将结果强制向下转换为[[String:String]]

let teamArray = try managedContext.fetch(fetchRequest) as! [[String:String]]

然后将字典映射到键 team 的值

let teamNames = teamArray.map  $0["team"]! 

【讨论】:

我想出了另一个解决方案,但没有你的那么优雅。我知道我可以用 .map 做到这一点,但一直忘记我正在向下转换一个数组。 如果您要使用键或索引订阅,则必须将Any 强制转换为更具体的内容。 非常感谢您的快速回复。 很抱歉,您的选择非常糟糕。永远不要使用valueForKey 从字典中获取值。在 Swift 中使用总是键订阅。而valueForKey——属于NSObject——需要丑陋的演员阵容到AnyObject。这非常objectivec-ish

以上是关于从 NSFetchRequest 将字典数组转换为值数组的主要内容,如果未能解决你的问题,请参考以下文章

如何在字典数组中转换 FIRDataSnapshot?斯威夫特 3

如何将字典转换为数组

将字典中的数组转换为数组列表

将字典值转换为数组

如何将嵌套字典转换为 3D 数组

将 js 数组转换为字典/哈希图