Core data 设置NSManagedObject的Bool属性抛出;iOS 10中的未捕获异常”;

Core data 设置NSManagedObject的Bool属性抛出;iOS 10中的未捕获异常”;,core-data,swift3,xcode8,ios10,Core Data,Swift3,Xcode8,Ios10,我正在将我的应用升级到iOS 10/swift 3 因此,以这种方式使用字典(从远程数据库接收的值)构造一个NSManagedObject let writerDictionary = [ ...: writer.id, ...: writer.name, ...: writer.picture, ...: writer.publicationID, ...: writer.language,

我正在将我的应用升级到iOS 10/swift 3

因此,以这种方式使用字典(从远程数据库接收的值)构造一个
NSManagedObject

    let writerDictionary = [
        ...: writer.id,
        ...: writer.name,
        ...: writer.picture,
        ...: writer.publicationID,
        ...: writer.language,
        ...: writer.country
    ]

    let newWriter = Writer(dictionary: writerDictionary, context: SHARED_CONTEXT)
isFavorite
是一个
NSManaged
属性,我在构建
newWriter
对象之后,在保存上下文之前,用
newWriter.isFavorite=true
手动将其设置为
true

这条线在iOS 10中意外崩溃-之前iOS 9没有任何问题

我还尝试了
newWriter.setValue(true,forKey:“isFavorite”)
——虽然它不会使应用程序崩溃,但bool值
isFavorite
保持
false
不变

有什么想法吗?这是我的NSManagedObject的Writer子类

import UIKit
import CoreData

@objc(Writer)

class Writer: NSManagedObject {

    // Attributes also in the database
    @NSManaged var id: NSNumber
    @NSManaged var name: String
    @NSManaged var picture: String?
    @NSManaged var publicationID: NSNumber
    @NSManaged var language: String
    @NSManaged var country: String
    @NSManaged var lastArticle: Date

    // Attributes only in the iOS app
    @NSManaged var isFavorite: Bool           // Initial value is false
    @NSManaged var hasNewArticles: Bool

    // Relationship objects
    @NSManaged var publication: Publication
    @NSManaged var articles: [Article]

    var writerImage: UIImage? {
        get {
            return ImageCache.sharedCache.imageWithIdentifier("writers-" + String(id))
        }
        set {
            ImageCache.sharedCache.storeImage(newValue, withIdentifier: "writers-" + String(id))
        }
    }

    override init(entity: NSEntityDescription, insertInto context: NSManagedObjectContext?) {
        super.init(entity: entity, insertInto: context)
    }

    init(dictionary: [String : AnyObject], context: NSManagedObjectContext) {
        let entity = NSEntityDescription.entity(forEntityName: "Writer", in: context)!
        super.init(entity: entity, insertInto: context)

        id = ...  
        name = ...  
        picture = ...  
        publicationID = ...  
        language = ...  
        country = ...  
        lastArticle = ...  
    }

    override func prepareForDeletion() {
        if let _ = writerImage {
            writerImage = nil
        }
    }
}

解决方案

当前版本的Swift 3 beta在处理前缀为“is”的属性方面似乎存在一些缺陷

像这样调整属性的名称,解决了它

 @NSManaged @objc(isFavorite) var isFavorite: Bool

在Xcode 8 beta 3编译器中修复

从发行说明中:

早期的Swift 3 Beta隐式地重命名了属性getter和 名称以开头的Bool类型@objc属性的setter “is”,以匹配Objective-C命名约定。(例如 名为isMagical的Swift布尔属性生成了Objective-C 形式@property(非原子,getter=isMagical)BOOL的声明 (神奇的)结果是,这造成的麻烦超过了它的价值和价值 已被删除。(26847223)


“未捕获异常”不是崩溃原因。例外情况的详细信息是什么?什么都没有!这就是我在控制台中得到的全部信息。“libc++abi.dylib:以NSException类型的未捕获异常终止”在异常上放置一个断点,看看它在哪里崩溃。当我尝试在
newWriter.isFavorite=true
中将
isFavorite
属性设置为
true时,它崩溃了。控制台除了上面双引号之间的一行之外,没有给出任何东西。转到堆栈跟踪中的最新一行(在左侧)和调试器类型中“po$arg1”该死,这是我的var的问题,它是数据…原始
@NSManaged var jsonData:NSData
工作
@NSManaged@objc(jsonData)var jsonData:NSData