在Swift中循环添加文本

Isu*_*uru 5 arrays string append ios swift

我需要追加一个字符串数组,最后得到一个字符串,以 UILabel下列格式显示.

Action1 | Action2 | Action3 | 措施4

for action in actions {

    actionLabel.text += "\(action.name) |"
}
Run Code Online (Sandbox Code Playgroud)

这给了我以下错误.

'String?' is not identical to 'UInt8'.
Run Code Online (Sandbox Code Playgroud)

出现此错误的原因是什么?有没有其他方法可以实现这一目标?

谢谢.

Bri*_*kel 15

这是Swift的许多神秘错误消息之一.据我所知,因为左侧和右侧不匹配(Optional<String>vs String),最好的猜测是你的意思是双方都是UInt8.

为了克服UILabel.text可选的事实,你可以做很多事情:

actionLabel.text = (actionLabel.text ?? "") + "\(action.name) |"
Run Code Online (Sandbox Code Playgroud)

这将获取当前值或空字符串并附加文本.您还可以在功能上避免此问题:

actionLabel.text = join(" | ", map(actions, { $0.name }))
Run Code Online (Sandbox Code Playgroud)

更新

关于|在""中有一个额外的迭代解决方案,我试图说明导致错误的行的解决方案.您发布的代码也会假设actionLabel最初为空白,并且多次设置标签文本会产生一些(可能无关紧要的)性能成本.

完整的迭代方法可能如下所示:

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

映射和连接是一种常见的操作,大多数语言都有干净简洁的方法,无需迭代即可完成.例如,我会在Objective-C中推荐以下内容:

actionLabel.text = [[actions valueForKeyPath:@"name"] componentsJoinedByString:@" | "];
Run Code Online (Sandbox Code Playgroud)


Kir*_*ins 5

text属性是可选的nil.您可以使用可选链接来完成此操作.在完成循环之前还要设置初始文本.

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

for action in actions {
    actionLabel.text? += "\(action.name) |"
}
Run Code Online (Sandbox Code Playgroud)