ジェネリックメソッドは、実行中のクラスに基づいて型を推測することは可能ですか? CoreData NSManagedObjectモデルを使用してローカルデータを格納および取得し、すべてのものを読みやすく、使いやすい方法で汎用的にすることができました。これが正しく、データベース内の「すべて」のポストオブジェクトを返しますが、構文がタイプする必要がありSwiftを使用したクラスメソッドの汎用タイプを推論する
let posts: [Post] = Post.all()
:ユーザーがオブジェクトのリストを取得するためのローカルデータベースを照会したい場合、彼は次の行を記述します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
}
}
誰もがその後、私に知らせてくださいについての考えを持っている場合。すべての助けに感謝します!
私はそれを試してみましょう。また、RE:コードスタイル - 私はそれを検討します。大会そのものは、スウィフトで他の人と仕事をしていたにもかかわらず、それは標準であった。しかし、私はこのプロジェクトでは協力していませんので、言語ガイドラインが違う点を指摘すれば、それを確立する理由はないと思います。 –
私がこれを実装し始めたのを見てきたことの一つは、 'let request = Animal.fetchRequest'は' let request = Animal.fetchRequest() 'でなければなりません。他の人がこの回答を見ると、その修正を使ってあなたの回答を編集するのに役立つかもしれません。 –