2017-11-01 3 views
1

Ich habe eine Klasse, die generisch ist, wie:„Generic Parameter‚Wert‘nicht geschlossen werden konnte“ für `observe`

class Row<T> { 

    ... 

} 

Wenn ich eine Instanz von , wo TExampleClass ist, möchte ich in der Lage zu tun:

row.bind(to: \ExampleClass.category) 

Dann in bind ich ExampleClass.category für meine ExampleClass Instanz gestartet werden soll beobachten, dass ich in der Klasse haben.

Ich habe implementiert:

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)") 
     }) 
    } 
} 

Das gibt mir den Fehler: Generic parameter 'Value' could not be inferred.

Wie ist das möglich? Die T ist gelöst, aber warum kann nicht Value abgeleitet werden? Es sollte von dem Parameter targetKeyPath stammen.

Voll Code für repoducable:

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 

      }) 
     } 
    } 

} 

Wie ich möchte das Beispiel-Klasse verwenden oben:

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

Bitte geben Sie genügend Code, um uns zu reproduzieren. Zum Beispiel, was ist 'Modell'? – matt

+0

@matt Code hinzugefügt, um zu reproduzieren – netigger

+0

Der Fehler, den Sie angeben, erscheint _without_ Verweis darauf, ob Sie 'row.bind (to: \ ExampleClass.category)' aufrufen oder nicht. Es ist eine Tatsache, wie 'bind' selbst definiert ist. Was ist daran dran, dass du denkst, dass "Wert" verrechnet wird? – matt

Antwort

1

Du bist wahrscheinlich über denken dies. Das Problem ist, dass model bekannt ist, nur ein NSObject zu sein. Sie können einfach so reproduzieren:

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

Gleicher Fehler. Wenn Sie model ändern, um eine ExampleClass zu sein, verschwindet das Problem.

+0

Dies ist nicht so allgemein wie ich wollte, siehe mein Update. – netigger

+0

Ich weiß, dass es nicht das ist, was Sie erhofft haben. Ich versuche nur, die Fehlermeldung zu erklären. – matt

+0

Richtig, sehe meinen aktualisierten Code – netigger

Verwandte Themen