Swift 能否为闭包内的元组元素创建名称';s参数列表?

Swift 能否为闭包内的元组元素创建名称';s参数列表?,swift,tuples,Swift,Tuples,这是一个属性,对于由红色的UInt8s、绿色和蓝色组成的颜色,它提供了足够好的亮度表示 var luma: UInt8 { return UInt8( [(red, 54), (green, 183), (blue, 19)].reduce(0){ let (color, eightBitWeight) = $1 return $0 + Int(color) * eightBitWeight } >&g

这是一个属性,对于由
红色
UInt8
s、
绿色
蓝色
组成的颜色,它提供了足够好的亮度表示

var luma: UInt8 {
    return UInt8(
        [(red, 54), (green, 183), (blue, 19)].reduce(0){
            let (color, eightBitWeight) = $1
            return $0 + Int(color) * eightBitWeight
        } >> 8
    )
}
我希望它看起来像这样,但它不能编译:

[(red, 54), (green, 183), (blue, 19)].reduce(0){ luma, (color, eightBitWeight) in
    luma + Int(color) * eightBitWeight
} >> 8
我们能不能更近一点,没有比前者更多的代码

[(red, 54), (green, 183), (blue, 19)].reduce(0) {
    (luma, let (color, eightBitWeight)) in
    return luma + Int(color) * eightBitWeight
}
但我有编译器错误

这里离我最近

[(red, 54), (green, 183), (blue, 19)].reduce(0) {
    (luma, item: (color: Int, eightBitWeight: Int)) in
    return luma + Int(item.color) * item.eightBitWeight
}

我不确定红色
绿色
蓝色
的类型是什么,所以我将它们设为
Int

作为元组的替代,您考虑过枚举吗

enum RGBColor {
    case Red(UInt32)
    case Green(UInt32)
    case Blue(UInt32)
    func toLumaComponent() -> UInt32 {
        switch self {
        case let .Red(weight):   return weight << 16
        case let .Green(weight): return weight << 8
        case let .Blue(weight):  return weight
        }
    }
}

[RGBColor.Red(54), .Green(183), .Blue(19)].reduce(UInt32(0)) {
    luma, color in
    return luma | color.toLumaComponent()
}
enum RGBColor{
红色外壳(UInt32)
绿色外壳(UInt32)
蓝色外壳(UInt32)
func toLumaComponent()->UInt32{
切换自身{

case let.Red(重量):返回重量我认为您的原始解决方案:

let red = 1, green = 2, blue = 3
var luma: UInt8 {
    return UInt8(
        [(red, 54), (green, 183), (blue, 19)].reduce(0){
            let (color, eightBitWeight) = $1
            return $0 + Int(color) * eightBitWeight
            } >> 8
    )
}
非常好,因为它是最小的和显式的(尽管我同意元组解包语法可能更简单),但是如果您希望显式键入更紧凑,那么您可以使用默认参数名称:

let red = 1, green = 2, blue = 3
[(red, 54), (green, 183), (blue, 19)].reduce(0) {
    $0 + Int($1.0) * $1.1
}
但这更难理解。如果是我的代码,我会使用更短的变量名,并调整原始格式:

let r = 1, g = 2, b = 3
return reduce([(r, 54), (g, 183), (b, 19)], 0) { let v = $0, (color, weight) = $1
    return v + color * weight
}

为什么不直接使用
Int(红色)*54+Int(绿色)*183+Int(蓝色)*19
?然后,代码不会自动记录权重的范围。我正在使用组件的私有枚举,例如get{return self[.red]},表示红色的getter。整个颜色存储为UInt32。ChannelBitOffset。红色为24。您的函数执行我的setter和getter所做的操作,但它们实际上并不计算值。做得好。我想知道为什么需要外部参数。“return”但是不是。另外,我说过颜色是UInt8s,但我没有像您那样对变量名进行代码高亮显示;现在正在修复。