Swift - 用于减少Guard内部阵列的清洁语法

时间:2017-07-25 15:45:19

标签: swift reduce

我有两个数组驱动的UIView:[Float]“数据”和[UIColor]“颜色”。如果视图没有给出正确的数据,我显示一个空状态,由你在这里看到的guard语句控制:

private func unwrap() -> ([Float], [UIColor]) {
    guard
        let data = data, !data.isEmpty,
        let colors = colors, data.count == colors.count
        else { return ([1], [UIColor.lightGray]) } // empty state

    let total = data.reduce(0) { $0 + $1 }
    if total == 0 { return ([1], [UIColor.lightGray]) }

    return (data, colors)
}

我不喜欢重复使用两次的空状态return ([1], [UIColor.lightGray])。我试图在guard语句中添加data.reduce调用,如:

private func unwrap() -> ([Float], [UIColor]) {
    guard
        let data = data, !data.isEmpty,
        let colors = colors, data.count == colors.count,
        data.reduce(0) { $0 + $1 } != 0
        else { return ([1], [UIColor.lightGray]) } // empty state

    return (data, colors)
}

...编译器不理解语法

private func unwrap() -> ([Float], [UIColor]) {
    guard
        let data = data, !data.isEmpty,
        let colors = colors, data.count == colors.count,
        let total = data.reduce(0) { $0 + $1 }, total != 0
        else { return ([1], [UIColor.lightGray]) } // empty state

    return (data, colors)
}

...闭包data.reduce(0) { $0 + $1 }的结果不是可选的,因此不能包含在警卫声明中。

有更简洁的方法吗?

3 个答案:

答案 0 :(得分:2)

这是我的简化版:

private func unwrap() -> ([Float], [UIColor]) {
    guard let data = data, let colors = colors,
        data.count == colors.count, data.reduce(0, +) != 0  else {
            return ([1], [UIColor.lightGray])
    } // empty state

    return (data, colors)
}

Reduce只能使用Float的+函数,而空数据数组的reduce总是0,所以你不需要检查空状态。

答案 1 :(得分:0)

想出来。

private func unwrap() -> ([Float], [UIColor]) {
    guard
        let data = data, !data.isEmpty,
        let colors = colors, data.count == colors.count,
        (data.reduce(0) { $0 + $1 }) != 0
        else { return ([1], [UIColor.lightGray]) } // empty state

    return (data, colors)
}

答案 2 :(得分:0)

如何使返回值成为计算变量:

private func unwrap() -> ([Float], [UIColor]) {
    var emptyVal: ([Float], [UIColor]) {
        return ([1], [UIColor.lightGray])
    }

    guard
        let data = data, !data.isEmpty,
        let colors = colors, data.count == colors.count
        else { return emptyVal } // empty state

    let total = data.reduce(0) { $0 + $1 }
    if total == 0 { return emptyVal }

    return (data, colors)
}