iOS:属性为双精度时无法保存核心数据

iOS:属性为双精度时无法保存核心数据,ios,swift,core-data,crash,nsnumber,Ios,Swift,Core Data,Crash,Nsnumber,在我把笔记本电脑飞出窗外之前,我想先问问这里。我对iOS开发非常陌生,一直在玩弄核心数据,试图创建一个expense manager应用程序。我有一个名为“Account”的实体,它有两个非可选属性(name和initBalance),如下所示: //Account.swift class Account: NSManagedObject { override func awakeFromInsert() { super.awakeFromInsert()

在我把笔记本电脑飞出窗外之前,我想先问问这里。我对iOS开发非常陌生,一直在玩弄核心数据,试图创建一个expense manager应用程序。我有一个名为“Account”的实体,它有两个非可选属性(name和initBalance),如下所示:

//Account.swift

class Account: NSManagedObject {

    override func awakeFromInsert() {
        super.awakeFromInsert()
        initBalance = NSNumber(double: 0.0)
        name = ""
    }    
}

//Account+CoreDataProperties.swift

extension Account {

    @NSManaged var initBalance: NSNumber
    @NSManaged var name: String
}

我还创建了一个NSManagedObject子类,如下所示:

//Account.swift

class Account: NSManagedObject {

    override func awakeFromInsert() {
        super.awakeFromInsert()
        initBalance = NSNumber(double: 0.0)
        name = ""
    }    
}

//Account+CoreDataProperties.swift

extension Account {

    @NSManaged var initBalance: NSNumber
    @NSManaged var name: String
}
帐户实体在AccountsViewController(UITableViewController的子类,符合NSFetchedResultsController委托协议)中使用NSFetchedResultsController显示。要添加新帐户,我使用AccountsViewController中的segue将我指向AccountInfoViewController(如下所示),它有两个文本字段,一个用于名称,一个用于帐户余额。当后者即将消失时,将在上下文中插入一个新帐户,其名称和余额来自文本字段。一旦父控制器出现(AccountsViewController),它将尝试保存更改并更新tableView

现在,如果我插入一个余额为整数的新帐户,则生命是美好的;上下文能够保存更改,tableView通过显示新插入的帐户更新其行,我很高兴。当我尝试插入余额为十进制数的帐户时,应用程序会在上下文试图保存更改时崩溃。至于它为什么会发生,我没有得到任何有用的错误。以下是管理文本字段的控制器的代码:

class AccountInfoViewController: UIViewController {

    @IBOutlet weak var nameField: UITextField!
    @IBOutlet weak var balanceField: UITextField!

    var store: DataStore! // set by the parent viewController everytime this controller appears

    let numberFormatter = MyFormatter()


    // insert the new account into the context before the controller disappears
    override func viewWillDisappear(animated: Bool) {
        super.viewWillDisappear(animated)

        store.insertAccount(nameField.text!, balance: numberFormatter.numberFromString(balanceField.text!)!)
    }
}
MyFormatter是这样的:

func MyFormatter() -> NSNumberFormatter {
    let formatter = NSNumberFormatter()
    formatter.numberStyle = .DecimalStyle
    formatter.minimumFractionDigits = 2
    formatter.maximumFractionDigits = 2
    return formatter    
}
上面显示的数据存储包含一个简单的核心数据堆栈,负责插入上下文:

// DataStore.swift

class DataStore {

    let coreDataStack = CoreDataStack(modelName: "SmartMoney")

    // inserts a new account into the context
    func insertAccount(name: String, balance: NSNumber) -> Account {
        let account = NSEntityDescription.insertNewObjectForEntityForName("Account",
            inManagedObjectContext: coreDataStack.mainQueueContext) as! Account

        account.name = name
        account.initBalance = balance
        return account
    }
}

当balanceField包含非整数时,上下文是否有任何原因无法保存更改?谢谢你的阅读,如果你想让我发布代码的其他部分,请告诉我

我终于弄明白发生了什么事。将我的属性名称从
initBalance
更改为
startingBalance
可以使一切重新正常工作。事实上,将属性名称更改为任何不以
new
init
开头的名称都可以。我是从这里得到这个主意的


似乎在使用ARC时,属性名称不应以单词
new
开头。结果是
initBalance
(或者
newBalance
)产生了同样的问题。希望它能帮助下一个陷入类似问题的可怜人

什么是MyFormatter?你验证过它没有返回垃圾吗?@TomHarrington:我在上面添加了MyFormatter代码。是的,我已经验证过了,但它没有包含在上面显示的代码中。在返回它之前,您是否打印出了
帐户。initBalance
?@sschare:刚刚尝试过,它打印出了正确的十进制值。一旦它试图保存上下文,它就会崩溃……哦,既然你在赚钱,你就应该在数据模型中使用十进制数,并使用与之相关的方法来存储金额。这可能会解决您的问题,只要实现它们就行了。但奇怪的是,它只对非整数值崩溃。很好地解决了这个问题。当我的核心数据实体中有一个名为“logID”的int 16值时,我遇到了类似的问题。我可以通过将“logID”重命名为“logID”来修复它。我仍然不知道这有什么关系,但你的回答帮助解决了车祸