2014-09-23 5 views
5

Ich muss ein Array von Zeichenfolge anfügen und schließlich eine einzelne Zeichenfolge erhalten, die in einem UILabel im folgenden Format angezeigt werden soll.Anfügen von Text in einer Schleife in Swift

Aktion1 | Aktion2 | Aktion3 | Action4

for action in actions { 

    actionLabel.text += "\(action.name) |" 
} 

Dies gibt mir den folgenden Fehler.

Gibt es einen Grund für diesen Fehler? Gibt es einen anderen Weg, dies zu erreichen?

Vielen Dank.

Antwort

14

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:

+0

+1 für 'map' und' Join', es ist wahrscheinlich die einfachste Lösung für dieses Problem und wahrscheinlich auch die klarste. –

+0

+1 nil coalesce und für join/map - eine viel sauberere Lösung – ColinE

+0

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

5

text Eigenschaft ist optional kann nil sein. Sie können eine optionale Verkettung verwenden, um dies zu umgehen. Legen Sie auch den Anfangstext fest, bevor Sie die Schleife durchlaufen.

if actionLabel.text == nil { 
    actionLabel.text = "" 
} 

for action in actions { 
    actionLabel.text? += "\(action.name) |" 
} 
Verwandte Themen