簡體   English   中英

快速3-將實體作為函數的參數傳遞

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

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