gpt4 book ai didi

ios - swift 3 - 将实体作为参数传递给函数

转载 作者:搜寻专家 更新时间:2023-11-01 06:04:48 26 4
gpt4 key购买 nike

在早期版本的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 中,“无法推断通用结果类型”,所以我可以不传入实体标题字符串,而是传入实体类型,然后为我的获取请求打开它吗?

最佳答案

回答你的问题

so instead of passing in the entity title Strings, can I pass in the entity Type, and switch on that for my fetch request?

是的,那将是最好的方法。有点像

 retrieveItemsForRelatedEntity(entity: NSManagedObject, relatedEntity: String, identifier: String, sortDescriptors: [NSSortDescriptor]?) -> Array<AnyObject>? {

From another question

You have to specify the generic type because otherwise the method call is ambiguous.

The first version is defined for NSManagedObject, the second version is generated automatically for every object using an extension, e.g:

此扩展是自动生成的(如下面的 Animal 类型所示。

来自 Apple 的关于从 Swift 2 更改的文档至 Swift 3

NSFetchRequest is now a parameterized type based on a new NSFetchRequestResult protocol.

executeFetchRequest(...) 的函数名称在 Swift 3 中也发生了变化

public func fetch<T : NSFetchRequestResult>(_ request: NSFetchRequest<T>) throws -> [T]

Apple 文档对 NSFetchRequest 的更改示例

swift 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)")
}

swift 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 文档代码示例 Animal.fetchRequest可能是错误的,应该是 Animal.fetchRequest()

关于ios - swift 3 - 将实体作为参数传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40372072/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com