Anexar text en un ciclo en Swift

Necesito agregar una matriz de cadena y, finalmente, get una sola cadena que se mostrará en una UILabel en el siguiente formatting.

Acción1 | Acción2 | Acción3 | Acción4

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

Esto me da el siguiente error.

 'String?' is not identical to 'UInt8'. 

¿Alguna razón para este error? ¿Hay alguna otra forma de lograr esto?

Gracias.

Este es uno de los muchos posts de error crípticos de Swift. Por lo que puedo decir porque el lado izquierdo y el lado derecho no coinciden ( Optional<String> vs String ), su mejor suposition es que significó para ambos lados ser UInt8 .

Para superar el hecho de que UILabel.text es opcional, puede hacer las cosas de la manera más larga:

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

Esto obtiene el valor actual o una cadena en blanco y anexa el text. También podría evitar el problema funcionalmente:

 actionLabel.text = join(" | ", map(actions, { $0.name })) 

Actualizar

Con respecto a la solución iterativa con un extra | Al final del "", estaba tratando de ilustrar la solución a la línea que causa el error. Su código publicado también hace suposiciones sobre que ActionLabel ha estado inicialmente en blanco y tiene algunos costos de funcionamiento (probablemente insignificantes) de configurar el text de la label varias veces.

Un enfoque iterativo completo podría parecerse a esto:

 var text = "" for action in actions { if text.isEmpty { text = action.name } else { text += " | \(action.name)" } } actionLabel.text = text 

El mapeo y la unión son operaciones tan comunes que la mayoría de los idiomas tienen forms claras y sucintas de hacerlo sin iteración. Por ejemplo, recomendaría lo siguiente en Objective-C:

 actionLabel.text = [[actions valueForKeyPath:@"name"] componentsJoinedByString:@" | "]; 

text propiedad de text es opcional puede ser nil . Puede usar el encadenamiento opcional para sobrepasar esto. También establezca el text inicial antes de pasar por el ciclo.

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