2017-06-27 12 views
0

ObjectManagerというクラスがあり、ジェネリックタイプはO: Object, Persistableです。このようにして、領域の複数の異なるサブクラスで動作できる1つのクラスを持つことができます。しかし、問題は、エラーがあるcache = O(message: "hello world")最後の行にある:コールで不正な引数のラベルが(持っている「というメッセージ:」、期待「の値:」)ジェネリック型のクラス内のRealmオブジェクトでカスタムイニシャライザを使用するにはどうすればよいですか?

入力し、それは私がPersistableプロトコルの初期化子を使用することができることを私に示唆コンパイル中にObjectクラスのイニシャライザを期待していると不平を言っています。持続可能な初期化子をキャストすることは可能ですか?

protocol Persistable { 
    init(message: String) 
} 

class CustomObject: Object, Persistable { 
    dynamic var message: String = "" 
    required convenience init(message: String) { 
    self.init() 
    self.message = message 
    } 
} 

class ObjectManager<O>: NSObject where O: Object, O: Persistable { 
    var cache: O? 

    func didReceive(message: String) { 
    cache = O(message: "hello world") 
    } 
} 

答えて

4

あなたCustomObjectクラスの決勝を行い、ファクトリメソッドを使用して初期化子を交換する場合は、あなたが欲しいものを行うコードを取得します。残念なことに、Swiftコンパイラのエラーメッセージは、この場合、完全に役に立たないように非常に暗いです。

protocol Persistable { 
    static func factory(message: String) -> Self 
} 

final class CustomObject: Object, Persistable { 
    dynamic var message: String = "" 
    static func factory(message: String) -> CustomObject { 
     let x = CustomObject() 
     x.message = message 
     return x 
    } 
} 

class ObjectManager<O>: NSObject where O: Object, O: Persistable { 
    var cache: O? 

    func didReceive(message: String) { 
     cache = O.factory(message: "hello world") 
    } 
} 
+0

うーん、私は右のそれを作る場合は知らないが、そのようにそれを入れ、doesntの仕事 'finalクラスのCustomObject:Object'制約:オブジェクト、永続{ }' –

+0

ああ、私は 'Oを変更していました'O:CustomObject'に変更し、それを元に戻しません。この場合、初期化子を静的なファクトリメソッド(例えば、 'Persistable {static func factory(message:String) - > Self}')で置き換えることができます。これは、イニシャライザのバージョンが失敗した場合でも正しく動作します。 – AustinZ

+1

これは、ありがとう、ありがとう。多分あなたは答えを更新することができます。 –

関連する問題