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.
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
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
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