ฉันมีโพรโทคอล:
protocol ManagedObjectProtocol {
associatedtype Entity
static var identifierKey: String { get }
static func fetchRequest() -> NSFetchRequest<NSFetchRequestResult>
func toEntity() -> Entity?
}
ฉันยืนยันบางอย่างที่ฉัน NSManagedObject เรียนกับนามสกุลเหมือนนี้:
extension AppEntity: ManagedObjectProtocol {
typealias Entity = App
static var identifierKey: String {
return "articleId"
}
func toEntity() -> Entity? {
return nil
}
}
ตอนที่ฉันพยายามจะแฟ้มจัดเก็บกับคนใหม่ Xcode 13 ฉันได้ข้อผิดพลาดคือ:
ประเภท'AppEntity'ไม่ conform ต้องโพรโทคอล'ManagedObjectProtocol'
แต่ตอนที่ฉันแค่พยายามที่จะสั่งให้รหัสของอุปกรณ์มันสร้างสบายดี
มันเป็นตึก/แฟ้มจัดเก็บได้กับ Xcode 12 และแก่รุ่นแต่ด้วยคนใหม่ Xcode 13(และ Xcode 13.1)ฉันมีปัญหาแล้ว ที่อาจเป็นปัญหาหรอ? จะให้ฉันแก้ไขมันได้หรือเปล่า?
อีกอย่างนึงที่ฉันไปในฐานข้อผิดพลาดตอนที่จัดเก็บและไม่ใช่ตอนที่การดีบั๊กสร้างขึ้น ฉันมีรหัส fore เอารายการ:
func get<Entity: NSManagedObject>
(with predicate: NSPredicate? = nil,
sortDescriptors: [NSSortDescriptor]? = nil,
fetchLimit: Int? = nil,
inContext context: NSManagedObjectContext? = nil,
completion: @escaping (Result<[Entity], Error>) -> Void) {
if let ctx = context {
coreData.performTask({ (context) in
do {
let fetchRequest = Entity.fetchRequest()
fetchRequest.predicate = predicate
fetchRequest.sortDescriptors = sortDescriptors
if let fetchLimit = fetchLimit {
fetchRequest.fetchLimit = fetchLimit
}
let results = try context.fetch(fetchRequest) as? [Entity]
completion(.success(results ?? []))
} catch {
completion(.failure(error))
}
}, inContext: ctx)
} else {
coreData.performForegroundTask { context in
do {
let fetchRequest = Entity.fetchRequest()
fetchRequest.predicate = predicate
fetchRequest.sortDescriptors = sortDescriptors
if let fetchLimit = fetchLimit {
fetchRequest.fetchLimit = fetchLimit
}
let results = try context.fetch(fetchRequest) as? [Entity]
completion(.success(results ?? []))
} catch {
completion(.failure(error))
}
}
}
}
ฉันเข้าใจพวกนี้เกิดข้อผิดพลาดข้อความ:
ประเภท'รายการ'ไม่มีสมาชิก'fetchRequest'
เกิดอะไรขึ้น? ยังไงฉันซ่อมพวกนี้แข็งข้อมูลเกิดข้อผิดพลาดตอนที่จัดเก็บ?
ขอบคุณสำหรับช่วย
แก้ไข:
อีกหนึ่งตัวอย่างเพื่อช่วยวิธีการที่ผมให้เกิดข้อผิดพลาดกับ no member fetchRequest
:
func count(entity: NSManagedObject.Type,
with predicate: NSPredicate? = nil,
fetchLimit: Int? = nil,
completion: @escaping (Result<Int, Error>) -> Void) {
coreData.performForegroundTask { context in
do {
let fetchRequest = entity.fetchRequest()
fetchRequest.predicate = predicate
if let fetchLimit = fetchLimit {
fetchRequest.fetchLimit = fetchLimit
}
let count = try context.count(for: fetchRequest)
completion(.success(count))
} catch {
completion(.failure(error))
}
}
}