制作一个" NSManaged public var"一个可选的布尔

时间:2017-07-31 15:24:00

标签: swift core-data nsmanagedobject

如何使NSManaged public var成为可选的布尔值?当我键入以下内容时:

import Foundation
import CoreData
import UIKit

extension SomeClass {

    @NSManaged public var isLiked: Bool?
    @NSManaged public var isDisliked: Bool?

}

我收到错误:

无法将属性标记为@NSManaged,因为其类型无法在Objective-C中表示

我想要的是一个既不能liked又不能disliked的属性。

3 个答案:

答案 0 :(得分:4)

如果您使用@NSManaged,则必须遵守其规则。这些规则包括与ObjC合作,后者没有选项。但即使使用Core Data,也不必使用@NSManaged。只要您实现自己的访问器,就可以删除它。类似的东西:

public var isLiked : Bool? {
    get {
        willAccessValue(forKey: "isLiked")
        let isLiked = primitiveValue(forKey: "isLiked") as! Int64
        didAccessValue(forKey: "isLiked")
        return isLiked
    }
    set {
        willChangeValue(forKey: "isLiked")
        setPrimitiveValue(newValue, forKey: "isLiked")
        didChangeValue(forKey: "isLiked")
    }
}

答案 1 :(得分:0)

Tom Harrington的答案是正确的,因为@NSManaged类型必须与ObjC一起使用。但是,问题不在于可选类型。 @NSManaged类型可以是可选的,例如:

@NSManaged var someProperty: String?

这里的问题是Swift Bool类型。 Swift的Bool是一个对象,与ObjC基本类型BOOL不同。对于具有布尔属性的CoreData实体,应使用NSNumber?在代码中键入@NSManaged属性。然后,类似于Tom的答案,您可以设置一个单独的Bool访问器属性来获取/设置@NSManaged NSNumber属性,例如:

// the "liked" property is a Boolean attribute in your CoreData entity
@NSManaged var liked: NSNumber?

var isLiked: Bool? {
    get { return Bool(exactly: liked) }
    set { liked = NSNumber(booleanLiteral: newValue) }
}

通过isLiked属性,您可以像在Bool中一样在代码中使用它,但在CoreData的幕后,它将值存储为CoreData实体中Boolean属性的NSNumber。

答案 2 :(得分:0)

如果您将 Codegen 设置为手动,这可能是您遇到该问题的原因。您必须确保在创建 NSObject 子类时所有属性都是预设的,之后不需要添加其他属性。

如果您在已经创建 NSObject 子类之后尝试添加新属性,则会出现此错误。

我的解决方案:删除您的子类和属性文件,然后返回到您的 .xcdatamodeld 文件并使用您想要的所有属性重新生成它们。

相关问题