Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 核心数据Int16是可选的_Swift_Core Data_Optional - Fatal编程技术网

Swift 核心数据Int16是可选的

Swift 核心数据Int16是可选的,swift,core-data,optional,Swift,Core Data,Optional,在Swift中,如何将NSManaged Int16属性设置为可选,如下所示: NSManaged var durationType:Int16? 我收到编译器错误:property无法标记为@NSManaged,因为它的类型不能在Objective-C中表示 如果这是不可能的,并且我选中了Core Data model editor中的optional框,那么如何检查该属性在来自数据库时是否具有值 您可以将属性设置为可选,并将其保持为Int16。关键是不需要@NSManaged,但如果删除它,

在Swift中,如何将
NSManaged Int16
属性设置为
可选
,如下所示:

NSManaged var durationType:Int16?

我收到编译器错误:
property无法标记为@NSManaged,因为它的类型不能在Objective-C中表示

  • 如果这是不可能的,并且我选中了Core Data model editor中的
    optional
    框,那么如何检查该属性在来自数据库时是否具有值


  • 您可以将属性设置为可选,并将其保持为
    Int16
    。关键是不需要
    @NSManaged
    ,但如果删除它,则必须实现自己的访问器方法

    一种可能的实施方式:

    var durationType: Int16?
        {
        get {
            self.willAccessValueForKey("durationType")
            let value = self.primitiveValueForKey("durationType") as? Int
            self.didAccessValueForKey("durationType")
    
            return (value != nil) ? Int16(value!) : nil
        }
        set {
            self.willChangeValueForKey("durationType")
    
            let value : Int? = (newValue != nil) ? Int(newValue!) : nil
            self.setPrimitiveValue(value, forKey: "durationType")
    
            self.didChangeValueForKey("durationType")
        }
    }
    

    可以用
    returnmap(value){Int16($0)}
    let value=map(newValue){Int($0)}
    替换条件表达式。也许是口味的问题,但是避免了使用强制展开操作符。谢谢Tom。这意味着为数据模型中的许多属性实现访问器,这需要编写大量代码。如果我仍然想使用@NSManaged,有没有办法检查该属性的核心数据是否存储为NULL?您可以使用上面使用的相同的
    primitiveValueForKey
    调用检查nil。上面的
    get
    访问器只加载值并检查它是否为nil,如果需要,您可以在其他地方执行相同的操作。