【发布时间】:2016-09-19 21:50:07
【问题描述】:
泛型方法是否可以根据正在执行的类来推断其类型?我使用 CoreData NSManagedObject 模型来存储和检索本地数据,并设法以一种易于阅读和可用的方式使所有内容通用化,除了在一个地方。如果用户希望查询本地数据库以获取对象列表,他将编写以下行:
let posts: [Post] = Post.all()
这将正确返回数据库中的“所有” Post 对象,但语法要求在从 Post 类本身 (Post.all()) 调用方法之上定义类型 ([Post]),这感觉不必要的多余。有什么方法可以简单地通过从Post 类调用all() 方法来定义泛型类型?我想我可以创建用于获取数据的全局函数,如下所示:
let posts: [Post] = all()
这感觉不像语法如下那样可读:
let posts = Post.all()
尝试改进这一点的目的是让任何选择此项目的开发人员都可以轻松快速地学习结构和风格。此外,这有望在未来提高一般代码的可读性,无论是有人正在处理它还是只是出于其他原因阅读它。
为了更深入了解,这里是有关当前结构的更多信息:
//Model.swift - The model base class. All models extend this class.
class Model: NSManagedObject {
/**
Some other stuff here
**/
//MARK: Fetch
internal class func fetch<T: Model>(predicate: NSPredicate? = nil) -> [T]? {
do {
if let request = NSFetchRequest.FromEntityName(self.entityName) { //Get entity with the name defined in the current class
request.predicate = predicate
if let result = try self.context?.executeFetchRequest(request) as? [T] {
return result
}
}
}
catch let error as NSError {
Log.Error("\(error)")
}
return nil
}
//MARK: Fetch general
class func all<T: Model>() -> [T]? {
if let result: [T] = self.fetch() {
return result
}
Log.warning("No \(self.entityName) found")
return nil
}
}
//Post.swift - An example model class. Extends Model.swift
class Post: Model {
//some fields
}
//Example view controller
class ViewController: UIViewController {
override func viewDidLoad() {
let posts: [Post] = Post.all()
//do stuff
}
}
如果有人对此有任何想法,请告诉我。感谢所有帮助!
【问题讨论】: