簡體   English   中英

快速使用非可選對象將其視為可選

[英]Using non-optional object while swift consider it optional

我有一個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

我該怎么辦?

我認為dateTextField可能為零,並且致命錯誤與之相關。 要么Records(context: self.container.viewContext)是一個失敗的初始化程序,在某些情況下會返回nil對象。

我認為,如果將帶有create的抓取包裝到一個始終返回對象的方法中,則代碼的性能會更好。

就像是

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

    return record ?? Records(context: container.viewContext)
}

文本字段可能仍然存在問題,但是我仍然認為為該邏輯創建包裝方法是有意義的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM