Dies ist eine der vielen kryptischen Fehlermeldungen von Swift. Soweit ich das beurteilen kann, weil die linke Seite und die rechte Seite nicht übereinstimmen (Optional<String>
vs String
), ist die beste Schätzung, dass Sie für beide Seiten UInt8
gemeint haben.
Um darüber hinweg, dass UILabel.text
optional ist, können Sie die Dinge, den langen Weg machen:
actionLabel.text = (actionLabel.text ?? "") + "\(action.name) |"
Dieser den aktuellen Wert oder eine leere Zeichenkette wird und fügt den Text. Sie könnten auch vermeiden, das Problem funktionell:
actionLabel.text = join(" | ", map(actions, { $0.name }))
aktualisieren
Im Hinblick auf die iterative Lösung eine zusätzliche |
am Ende in der „“ mit, ich habe versucht, die Lösung zu veranschaulichen nur die Linie verursacht den Fehler. Ihr veröffentlichter Code macht auch Vermutungen darüber, dass actionLabel anfänglich leer war und einige (wahrscheinlich unbedeutende) Leistungskosten hat, den Etikettentext mehrmals zu setzen.
Ein vollständiger iterativer Ansatz könnte wie folgt aussehen:
var text = ""
for action in actions {
if text.isEmpty {
text = action.name
} else {
text += " | \(action.name)"
}
}
actionLabel.text = text
Mapping und Verbinden sind solche gemeinsamen Operationen, dass die meisten Sprachen haben saubere prägnante Art und Weise davon ohne Iteration zu tun. Zum Beispiel würde ich die folgende in Objective-C empfehlen:
+1 für 'map' und' Join', es ist wahrscheinlich die einfachste Lösung für dieses Problem und wahrscheinlich auch die klarste. –
+1 nil coalesce und für join/map - eine viel sauberere Lösung – ColinE
Danke @Brian. Eine kleine Sache. Wenn ich die letzte Zeichenfolge erhalte, sieht das so aus ** Action1 | Aktion2 | Aktion3 | **. Es hat ein extra Rohr am Ende. Wie kann ich die Saite ohne die nachfolgende Pfeife haben ** Action1 | Aktion2 | Action3 ** – Isuru