在Swift中循环添加文本

时间:2014-09-23 06:30:58

标签: ios arrays string swift append

我需要附加一个字符串数组,最后得到一个字符串,以UILabel格式显示。

Action1 | Action2 | Action3 |措施4

for action in actions {

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

这给了我以下错误。

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

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

谢谢。

2 个答案:

答案 0 :(得分:15)

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

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

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

这将获取当前值或空字符串并附加文本。你也可以在功能上避免这个问题:

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

<强>更新

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

完整的迭代方法看起来像这样:

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

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

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

答案 1 :(得分:5)

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

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

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