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,但我没有像您那样对变量名进行代码高亮显示;现在正在修复。