从 NSFetchRequest 将字典数组转换为值数组
Posted
技术标签:
【中文标题】从 NSFetchRequest 将字典数组转换为值数组【英文标题】:Convert Array of Dictionaries into Array of Values from NSFetchRequest 【发布时间】:2017-12-04 19:18:10 【问题描述】:我有一本使用fetchRequest.resultType = .dictionaryResultType
从NSFetchRequest
返回的字典,返回的字典是[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 将字典数组转换为值数组的主要内容,如果未能解决你的问题,请参考以下文章