我有两个数组驱动的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 }
的结果不是可选的,因此不能包含在警卫声明中。
有更简洁的方法吗?
答案 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)
}