【问题标题】:String array reduce字符串数组减少
【发布时间】:2014-11-15 02:24:37
【问题描述】:

我正在尝试通过 reduce 函数连接字符串数组的元素。现在尝试了一下,但我无法弄清楚问题到底是什么。这就是我认为应该做的伎俩。我也尝试过其他替代方案,但鉴于数量巨大,我将等待一些输入:

var genres = ["towel", "42"]
var jointGenres : String = genres.reduce(0, combine: { $0 + "," + $1 })

错误:

..:14:44: 无法使用类型参数列表调用“+” '(IntegerLiteralConvertible, combine: (($T6, ($T6, $T7) -> ($T6, $T7) -> $T5) -> ($T6, ($T6, $T7) -> $T5) -> $T5, (($T6, $T7) -> ($T6, $T7) -> $T5, $T7) -> (($T6, $T7) -> $T5, $T7) -> $T5) -> (($T6, ($T6, $T7) -> $T5) -> $T5, (($T6, $T7) -> $T5, $T7) -> $T5) -> $T5)'

根据我的理解,$0 应该被推断为一个字符串,而 $1 与 $0 组合也应该是一个字符串。我不知道这里的类型系统是怎么回事。有什么想法吗?

【问题讨论】:

    标签: swift reduce


    【解决方案1】:

    您的 reduce 闭包应该如下所示:

    var jointGenres : String = genres.reduce("", combine: { $0 == "" ? $1 : $0 + "," + $1 })
    

    这有 "" 而不是像你一样的 0,并确保返回值的开头没有多余的逗号。

    原始代码不起作用,因为在您尝试向其添加字符串时,documentation 中表示为 U 的返回类型最初在您的答案中为 0。在你的情况下,你真的希望 U 和 T 都代表字符串而不是整数。

    【讨论】:

    • 我忽略了第一个参数的含义,谢谢!
    【解决方案2】:

    reduce 在这里不是一个简单的解决方案,因为您需要对第一个元素进行特殊处理。 String 的 join 方法更适合这个用途:

    let strings = ["a", "b", "c"]
    let joinedString = ",".join(strings)
    

    如果您知道数组不为空,则还有另一种可能的 reduce 解决方案,它也可以避免条件:

    let joinedStrings = strings[1..<strings.count].reduce(strings[0]) { $0 + "," + $1 }
    

    【讨论】:

    • 在 Swift 4 中必须做 joinedString = strings.joined(separator: ";")
    【解决方案3】:

    Cocoa 已经有一个功能可以做到这一点。它被需要对 NSArray 进行类型转换而受到损害。

    var genres = ["towel", "42"]
    var joinGenres = (genres as NSArray).componentsJoinedByString(",")
    

    令我惊讶的是,这个函数还可以应用于字符串以外的类型的数组:

    let ints = [1,5,9,15,29]
    let listOfInts = (ints as NSArray).componentsJoinedByString(",")
    

    【讨论】:

      【解决方案4】:

      如果使用 Swift 4:

      var jointGenres:String = genres.joined(separator: ",")
      

      【讨论】:

        【解决方案5】:

        问题是您对reduce 的第一个参数。这是一个累加器,它是一个整数文字,它是在第一次运行块时作为$0 传递的内容。您要求 reduce 函数向此添加一个字符串。

        您应该传递一个空字符串 "",而不是 0 作为累加器参数。

        这行得通:

        var genres = ["towel", "42"]
        var jointGenres : String = genres.reduce("", combine: { $0 + "," + $1 })
        

        【讨论】:

        • 这不完全正确,你需要@erdekhayser 使用的三元表达式。
        猜你喜欢
        • 2021-12-07
        • 2017-02-14
        • 2022-01-13
        • 1970-01-01
        • 2017-06-12
        • 2015-02-10
        • 1970-01-01
        • 1970-01-01
        • 2022-01-01
        相关资源
        最近更新 更多