You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:37:11