私は、オーバーライドされたinit関数を持つオブジェクトを扱う関数を作成したいと考えています。これまでのところ、私はオーバーライドされたinit関数を使って作業していましたが、いくつかのロジックパーツで余分なコードを書く必要があるたびに、これらのオブジェクトを使って他のものを実行したいのですが。これを避け、コードをきれいにするためには、汎用関数witchを引数として持つようにしなければなりません。T.Type
便利なコンストラクタをコアデータベースに追加するための汎用関数
これは作業部分を示し、私のサンプルコードです:
import Foundation
import CoreData
extension Sample {
@nonobjc public class func fetchRequest() -> NSFetchRequest<Sample> {
return NSFetchRequest<Sample>(entityName: "Sample");
}
@NSManaged public var smth: String
@NSManaged public var smth1: Double
convenience init(smth: String, smth1: Double, insertIntoManagedObjectContext _context: NSManagedObjectContext!) {
let _enitity = NSEntityDescription.entity(forEntityName: "Sample", in: _context)
self.init(entity: _entity, insertInto: _context)
self.smth = smth
self.smth1 = smth1
}
}
そして、私はこのようなオブジェクトを初期化:ここからexapmleに従うことで
let _context = DataBaseController.getContext()
let _sample: Sample = Sample(smth: smth, smth1: smth1 insertIntoManagedObjectContext: _context)
DataBaseController.saveContext()
を:Example
私は」これらの機能を実装しました:
func addRecord<T: NSManagedObject>(_ type : T.Type) -> T {
let _entityName = T.description()
let _context = DataBaseController.persistentContainer.viewContext
let _entity = NSEntityDescription.entity(forEntityName: _entityName, in: _context)
let _record = T(entity: _entity!, insertInto: _context)
return _record
}
func recordsInDataBase<T: NSManagedObject>(_ type : T.Type) -> Int {
let _records = allRecords(T.self)
return _records.count
}
func allRecords<T: NSManagedObject>(_ type : T.Type, sort: NSSortDescriptor? = nil) -> [T] {
let _context = DataBaseController.persistentContainer.viewContext
let _request = T.fetchRequest()
do {
let _results = try _context.fetch(_request)
return _results as! [T]
} catch {
print("Error : \(error)")
return []
}
}
私の質問は:とsmth1
の2つの余分な引数を渡して、クラスからオーバーライドされたinit関数を呼び出すにはどうすればよいですか?
let _sample = DataBaseController.Instance.addRecord(...)
ありがとうございます!
編集:
このようになりますか? :
let _sample = DataBaseController.Instance.addRecord(Sample.self.init(smth: smth, smth1: smth1, insertIntoManagedObjectContext: _context))
'addRecord'のポイントは何ですか? 'let _sample:Sample = Sample(smth:smth、smth1:smth1 insertIntoManagedObjectContext:_context)'は既に新しいオブジェクトをデータベースに追加します。 – Sweeper
このようにして試してみる必要はありませんか?それから私が引数として必要とする他のメソッドを呼び出すときは、 'Sample.self'を送り、' Sample'のインスタンスを指していることを知っていますか? – yerpy
私はあなたがそれを意味するものを実際に得ていません。あなたの究極の目標は何ですか? – Sweeper