2017-11-01 7 views
1

`は、「一般的なパラメータvalueが推測することができませんでした」のように私は、ジェネリックであるクラスを持っています行うことができる:observe`

row.bind(to: \ExampleClass.category) 

次にbindに私はクラスを持っているというのが私のExampleClass例えばExampleClass.categoryを観察し始めたいです。

私が実装しました:Generic parameter 'Value' could not be inferred

func bind<Value>(to targetKeyPath: ReferenceWritableKeyPath<T, Value>) { 
    if let model = model as? NSObject { 
     model.observe(targetKeyPath, options: [.new ,.old], changeHandler: { _, change in 
      Log.info?.msg("Now we have some stuff: \(change)") 
     }) 
    } 
} 

これは私にエラーを与えます。

どうすれば可能ですか? Tは解決されますが、なぜValueを推測できないのですか?パラメータはtargetKeyPathである必要があります。

repoducableのための完全なコード:あなたは上-考え、これをおそらくだ

class Person: NSObject { 
    @objc var age: NSNumber? 
} 

class Book: NSObject { 
    @objc var title: String? 
} 

let row1 = Row(model: Person()) 
let row2 = Row(model: Book()) 

row1.bind(to: \Person.age) 
row2.bind(to: \Book.title) 
+0

私たちが再現できるように十分なコードを入力してください。例えば、 'モデル'は何ですか? – matt

+0

@mattは、コードを再現するためにコードを追加しました – netigger

+0

あなたが引用したエラーは、 'row.bind(to:\ ExampleClass.category)'を呼び出すかどうかにかかわらず、_without_参照になります。 'bind'自体がどのように定義されているかは事実です。あなたは「価値」を解決すると思いますか? – matt

答えて

1

:私は上記の例のクラスを使用したいのですがどのように

class Row<T> { 

    let model: T 

    init(model: T) { 
     self.model = model 
    } 

    func bind<Value>(to targetKeyPath: ReferenceWritableKeyPath<T, Value>) { 
     if let model = model as? NSObject { 
      model.observe(targetKeyPath, options: [], changeHandler: { _, _ in 

      }) 
     } 
    } 

} 

。問題はmodelがNSObjectだけであることがわかっていることです。次のように単純に再現することができます:

class ExampleClass:NSObject { 
    @objc dynamic var category = "" 
} 
let model = NSObject() 
model.observe(\ExampleClass.category) { _,_ in } 

同じエラーです。 modelをExampleClassに変更すると、問題は解決しません。

+0

これは私が望むほど一般的ではありません、私の更新を参照してください。 – netigger

+0

私はそれがあなたが望んでいたものではないことを知っています。私はエラーメッセージを説明しようとしています。 – matt

+0

私の更新コードを参照してください – netigger

関連する問題