Swift中获取Core Data实体属性名,现有实现是否有更高效替代方案?
获取Core Data实体属性名称的高效方法
嘿,你的代码确实能拿到想要的属性名称,但咱们可以用更简洁、甚至更高效的方式来实现~
首先,先看看你的原始代码:
func getAllAttributeTitles(_ myStatSheet:StatSheet) -> Array<String> { let dictAttributes = myStatSheet.entity.attributesByName var arrAttributeTitles:Array<String> = [] for (key, _) in dictAttributes { arrAttributeTitles.append(key) } return arrAttributeTitles }
更简洁的写法(单次调用场景)
因为attributesByName本身是一个[String: NSAttributeDescription]类型的字典,它的keys属性就是所有属性名称的集合,咱们可以直接把这个集合转成数组,省去手动循环的步骤:
func getAllAttributeTitles(_ myStatSheet: StatSheet) -> [String] { return Array(myStatSheet.entity.attributesByName.keys) }
这个写法和你的代码性能几乎一致,但代码更紧凑,可读性也更强。
更高效的写法(频繁调用场景)
如果你的代码会频繁调用这个方法,那可以考虑缓存属性名称——因为Core Data实体的属性在App运行期间是固定不变的,没必要每次都从entity里重新获取。咱们可以给StatSheet类加个静态扩展来缓存:
extension StatSheet { static let attributeTitles: [String] = { guard let entity = NSEntityDescription.entity(forEntityName: "StatSheet", in: yourManagedContext) else { return [] } return Array(entity.attributesByName.keys) }() }
或者如果你的StatSheet是NSManagedObject的子类,也可以用entity()方法来获取实体:
extension StatSheet { static let attributeTitles: [String] = Array(entity().attributesByName.keys) }
之后每次需要属性名称的时候,直接用StatSheet.attributeTitles就可以了,不用再传入实例,而且只在第一次调用时计算一次,后续都是直接用缓存好的数组,性能更优。
补充说明
需要注意的是,attributesByName的key就是属性的名称,和NSAttributeDescription的name属性是完全一致的,所以不管用哪种方式,拿到的都是正确的属性名称~
内容的提问来源于stack exchange,提问作者PruitIgoe
相关产品推荐
相关产品推荐

