【问题标题】:Appending text in a loop in Swift在 Swift 中循环添加文本
【发布时间】:2014-11-17 06:14:51
【问题描述】:

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

动作1 |行动2 |行动3 |行动4

for action in actions {

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

这给了我以下错误。

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

这个错误有什么原因吗?有没有其他方法可以做到这一点?

谢谢。

【问题讨论】:

    标签: ios arrays string swift append


    【解决方案1】:

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

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

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

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

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

    更新

    关于在“”末尾有一个额外的| 的迭代解决方案,我试图说明导致错误的行的解决方案。您发布的代码还假设 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 表示mapjoin,这可能是解决此问题的最简单方法,也可能是最清晰的方法。
    • 谢谢@Brian。一件小事。当我得到最终的字符串时,它看起来像这样 Action1 |行动2 |行动 3 |。它的末端有一个额外的管道。我怎样才能让字符串没有像这样的尾随管道 Action1 |行动2 |行动3
    • @Isuru 我已经更新了关于如何做你正在尝试的事情的更长解释。我真的认为你想避免循环,因为 map/join 更简单。
    • @BrianNickel 谢谢。它工作得很好。我不熟悉地图功能,但我目前正在研究它。一旦我掌握了它,将重新实现它。再次感谢您的详细回答。
    【解决方案2】:

    text 属性是可选的,可以是nil。您可以使用可选链接来解决这个问题。还要在循环之前设置初始文本。

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

    【讨论】:

      猜你喜欢
      • 2016-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多