[英]swift 3 - pass entity as argument to function
在Swift的早期版本中,我具有核心數據功能
func retrieveItemsForRelatedEntity(entity: String, relatedEntity: String, identifier: String, sortDescriptors: [NSSortDescriptor]?) -> Array<AnyObject>? {
let appDel: AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
let context: NSManagedObjectContext = appDel.managedObjectContext!
let frequest = NSFetchRequest(entityName: entity)
frequest.returnsObjectsAsFaults = false
if sortDescriptors != nil {
frequest.sortDescriptors = sortDescriptors
}
switch relatedEntity {
case "CostCentre":
frequest.predicate = NSPredicate(format: "costCentre.identifier == '\(identifier)'")
return try! context.executeFetchRequest(frequest)
case "CostCentreDay":
frequest.predicate = NSPredicate(format: "costCentreDay.identifier == '\(identifier)'")
return try! context.executeFetchRequest(frequest)
case "Resource":
frequest.predicate = NSPredicate(format: "resource.identifier == '\(identifier)'")
return try! context.executeFetchRequest(frequest)
case "ResourceDay":
frequest.predicate = NSPredicate(format: "resourceDay.identifier == '\(identifier)'")
return try! context.executeFetchRequest(frequest)
case "CostedDay":
frequest.predicate = NSPredicate(format: "costedDay.identifier == '\(identifier)'")
return try! context.executeFetchRequest(frequest)
default:
print("wrong entity for this function")
return nil
}
}
使用Swift 3.0,“無法推斷出通用結果類型”,因此我可以傳入實體類型,然后為我的提取請求打開該實體,而不是傳入實體標題字符串。
回答你的問題
因此,除了傳遞實體標題字符串之外,我還可以傳遞實體類型,然后為我的提取請求啟用它嗎?
是的,那將是最好的方法。 就像是
retrieveItemsForRelatedEntity(entity: NSManagedObject, relatedEntity: String, identifier: String, sortDescriptors: [NSSortDescriptor]?) -> Array<AnyObject>? {
您必須指定泛型類型,因為否則方法調用是不明確的。
第一個版本是為NSManagedObject定義的,第二個版本是使用擴展名自動為每個對象生成的,例如:
此擴展名是自動生成的(如下面的Animal
類型所示。
從Apple文檔中了解從Swift 2
到Swift 3
更改
NSFetchRequest現在是基於新NSFetchRequestResult協議的參數化類型。
Swift 3中的executeFetchRequest(...)
函數名稱也已更改
public func fetch<T : NSFetchRequestResult>(_ request: NSFetchRequest<T>) throws -> [T]
Apple文檔對NSFetchRequest
更改的NSFetchRequest
迅捷2
func findAnimals() {
let request = NSFetchRequest(entityName:”Animal")
do {
guard let searchResults = try context.executeFetchRequest(request) as? [Animal] else {
print("Results were not of the expected structure")
}
... use(searchResults) ...
} catch {
print("Error ocurred during execution: \(error)")
}
}
迅捷3
func findAnimals() {
let request: NSFetchRequest<Animal> = Animal.fetchRequest
do {
let searchResults = try context.fetch(request)
... use(searchResults) ...
} catch {
print("Error with request: \(error)")
}
}
因此,在Swift 2中轉換代碼以創建NSFetchRequest
let frequest = NSFetchRequest(entityName: entity)
到Swift 3
let frequest: NSFetchRequest<YourEntityType> = YourEntityType.fetchRequest()
和
context.executeFetchRequest(frequest)
將會
context.fetch(frequest)
注意:從網絡上的其他示例來看,Apple docs Animal.fetchRequest
示例代碼可能是錯誤的,而應該是Animal.fetchRequest()
請嘗試這個。 它幫助了我。
func retrieveItemsForRelatedEntity(entity: String, relatedEntity: NSEntityDescription, identifier: String, sortDescriptors: [NSSortDescriptor]?) -> Array<AnyObject>? {
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let context: NSManagedObjectContext = appDelegate.persistentContainer.viewContext
let frequest = NSFetchRequest<NSFetchRequestResult>(entityName: entity)
和
switch relatedEntity {
case NSEntityDescription.entity(forEntityName: "CostCentre", in: context)!:
嘗試這個 :
let frequest = NSFetchRequest<NSFetchRequestResult>(entityName: entity)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.