2016-10-22 3 views
1

Betrachten Sie den folgenden Code ein:flatMap und `mehrdeutige Verweis auf member` Fehler

typealias PersonRecord = [String : AnyObject] 

struct Person { 
    let name: String 
    let age: Int 

    public init(name: String, age: Int) { 
     self.name = name 
     self.age = age 
    } 
} 

extension Person { 
    init?(record : PersonRecord) { 
     guard let name = record["name"] as? String, 
     let age = record["age"] as? Int else { 
      return nil 
     } 

     self.name = name 
     self.age = age 
    } 
} 

Jetzt möchte ich eine Reihe von Person s aus einem Array von Record s erstellen:

let records = // load file from bundle 
let persons = records.flatMap(Person.init) 

Aber ich erhalten folgende Fehlermeldung:

error: ambiguous reference to member 'init(name:age:)' 

Wenn ich die failable initializer aus bewegen Bei der Erweiterung bekomme ich immer noch den gleichen Fehler.

Was ich hier fehlt, ist dies nicht eine korrekte Verwendung von flatMap?

EDIT - gelöst:

Gefunden der Fehler: Der Code, der in der Aufzeichnungen-Datei von der Festplatte gelesen, die falsche Art zurückgegeben. Sobald ich das behoben hatte, ging der Fehler weg.

+1

Compiliert gut für Ich nehme an, dass 'records' vom Typ' [PersonRecord] 'ist. Wie bei allen seltsamen Compiler-Fehlern, versuchen Sie, Ihren Build-Ordner zu säubern - und wenn Sie auf einem Spielplatz sind, versuchen Sie es in einem vollständigen Projekt. – Hamish

+0

Das ist gut zu wissen; Ich habe diesen Code auf einen brandneuen PlayGround und keine Fehler verschoben. Wie säubere ich den Erstellungsordner für einen Spielplatz, falls vorhanden? – Koen

+0

Ich glaube nicht, dass Sie (zumindest nicht leicht) auf einem Spielplatz können. Persönlich würde ich vermeiden, Spielplätze mit zu beginnen, da sie notorisch Buggy sind - ein vollständiges Projekt eine viel bessere Swift-Umgebung ist. – Hamish

Antwort

2

Dazu

let persons = records.flatMap(Person.init) 

die param bestand zur flatMap Schließung arbeiten muß der gleiche Typ von Person.init empfangen werden, also muss es PersonRecord sein.

Dann Aufzeichnungen müssen eine Liste von PersonRecord sein, so etwas wie dieses

let records: [PersonRecord] = [] 

Jetzt funktioniert es

let persons = records.flatMap(Person.init)  
0

Die meisten der Zeit die Ambiguous reference to member in einem map oder flatMap liegt daran, dass der Rückgabetyp isn ‚t angegeben

array.flatMap({ (item) -> ObjectToReturn? in }) 
Verwandte Themen