【问题标题】:Core Data: How to check if value is compatible with attribute?核心数据:如何检查值是否与属性兼容?
【发布时间】:2016-02-15 09:24:19
【问题描述】:

我正在寻找一种方法来检查任意值是否与给定属性兼容。

如果尝试将NSNumber 设置为firstName,而NSString 应为预期,则会引发此异常:

Fatal Exception: NSInvalidArgumentException
Unacceptable type of value for attribute: property = "name"; desired type = NSString; given type = __NSCFNumber;

当处理动态且可能是错误的数据时,例如从服务接收JSON 时,我想在运行时检查该值是否兼容。对于属性类型和值的所有组合,是否有任何简单而稳定的方法来执行此操作?

【问题讨论】:

  • 你能举一个更具体的例子吗?您是在运行时获取动态数据,还是不想在编译/设计时处理类型一致性?
  • 您可以检查核心数据实体 NSEntityDescription,比较 stackoverflow.com/questions/23565073/…
  • @vadian,我在运行时获取动态数据并希望忽略无效数据,而不是崩溃。我确实想要类型一致性。
  • 如果是数字/字符串示例,其中需要字符串,请使用字符串插值"\(value)"

标签: ios swift core-data


【解决方案1】:

每个核心数据实体都由一个实例NSEntityDescription描述, 其中包含有关属性、属性、它们的所有信息 类型等。

NSManagedObjectentity 属性是对它的引用 描述。

这是一个作为“概念证明”的可能实现。

myObject.safeSetValue(value, forKey: key)

如果值类型与实体类型兼容,则设置值(并返回true),否则返回false

extension NSManagedObject {

    func safeSetValue(value : AnyObject, forKey key : String) -> Bool {

        // Get NSAttributeDescription for key:
        guard let attr = self.entity.attributesByName[key] else {
            return false
        }
        // Get name of the class used to represent the attribute:
        guard let cname = attr.attributeValueClassName else {
            return false
        }
        // Create class object from name:
        guard let cls : AnyClass = NSClassFromString(cname) else {
            return false
        }
        // Check if given value is an instance of a subclass:
        if !value.isKindOfClass(cls) {
            return false
        }
        // Finally: Set value for key:
        self.setValue(value, forKey: key)
        return true
    }
}

【讨论】:

    【解决方案2】:

    您可以如下使用 Swift 的功能

    let desiredVariable = responseData["key"] as? String ?? ""

    这将检查返回的数据是否为字符串类型。如果没有,那么它将用空字符串初始化。

    【讨论】:

      猜你喜欢
      • 2017-01-05
      • 1970-01-01
      • 2014-10-28
      • 1970-01-01
      • 2017-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多