我需要附加一个字符串数组,最后得到一个字符串,以UILabel
格式显示。
Action1 | Action2 | Action3 |措施4
for action in actions {
actionLabel.text += "\(action.name) |"
}
这给了我以下错误。
'String?' is not identical to 'UInt8'.
出现此错误的原因是什么?有没有其他方法可以实现这个目标?
谢谢。
答案 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) |"
}