[英]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.