使用非可选对象,而swift认为它是可选的

时间:2018-04-18 19:14:18

标签: ios swift core-data optional-parameters

我有一个coreData NSManagedObject,如下所示:

public class Records: NSManagedObject {
    @NSManaged public var uid: String
    @NSManaged public var datetime: Date
}

另外,我有一个助手来通过UID检索记录:

func getRecordByUid(uid: String) -> Records!{
    do {
        let fetchRequest : NSFetchRequest<Records> = Records.createFetchRequest()
        fetchRequest.predicate = NSPredicate(format: "uid = %@", uid)
        let result: [Records] = try container.viewContext.fetch(fetchRequest)
        return result.first
    } catch {
        print(error.localizedDescription)
        return nil
    }
}

现在,在我的视图控制器中,我使用核心数据对象作为非可选(用于添加新记录或编辑现有记录目的),如下所述:

class AddRecordViewController: UIViewController {

    var container: NSPersistentContainer!
    var record: Records!
    var currentUid = ""
    @IBOutlet weak var dateTextField: PickerBasedTextField!

    override func viewDidLoad() {
        super.viewDidLoad()

        // initialise core data
        container = NSPersistentContainer(name: "MyModel")
        container.loadPersistentStores { (storeDescription, error) in
            self.container.viewContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy

            if let error = error {
                print("Unsolved error \(error.localizedDescription)")
            }
        }

        if let existingRecord = Facade.share.model.getRecordByUid(uid: currentUid) {
            record = existingRecord
        } else {
            record = Records(context: self.container.viewContext)
        }

        // datePicker
        let formatter = DateFormatter()
        formatter.dateStyle = .medium
        dateTextField.text = formatter.string(from: record.datetime)

        ...
    }
}

问题是它导致dateTextField.text = ...行出错,因为它认为record是可选的,但不是这样:

(lldb) po record
▿ Optional<Records>

Fatal error: Unexpectedly found nil while unwrapping an Optional value

我该怎么办?

2 个答案:

答案 0 :(得分:1)

我认为dateTextField可能是零,致命错误与它有关。要么是这样,要么Records(context: self.container.viewContext)是一个可用的初始化器,在某些情况下会返回一个nil对象。

答案 1 :(得分:1)

我认为如果将带有create的fetch包装到一个始终返回对象的方法中,你的代码会表现得更好。

这样的东西
Amazon::S3

文本字段可能仍然存在问题,但我仍然认为为此逻辑创建包装器方法是有意义的。