我正在寻找最有效的方法:
在我的应用程序中有一个名为Color()的结构。它由3个浮点组成(RGB格式的每种颜色一个)。要向用户显示当前的红色,绿色或蓝色值,需要对其进行舍入。要在我的应用程序中保存和使用,它需要保持不变。 我只是在Color()结构中添加了三个计算属性。然而,这似乎对我来说效率低下。还有更好的方法吗?
struct Color {
var red, green, blue: Float
var roundedRed: Float {
return round(red * 10) / 10
}
var roundedGreen: Float {
return round(green * 10) / 10
}
var roundedBlue: Float {
return round(blue * 10) / 10
}
init(red: Float, green: Float, blue: Float) {
self.red = red
self.green = green
self.blue = blue
}
}
我知道这对处理效率不利。我只是想学习良好的代码礼仪。
答案 0 :(得分:0)
我会使用结构来保存未接地的数字,并根据需要为Float写一个扩展名以进行舍入。
E.g。
struct Color {
var red, green, blue: Float
init(red: Float, green: Float, blue: Float) {
self.red = red
self.green = green
self.blue = blue
}
}
extension Float {
var rounded: Float {
get{
return round(self*10)/10
}
}
}
然后获得圆角值,你只需使用
someColor.red.rounded
如果您只想将值作为字符串检索,正如dfri正确选择的是您的预期用途,您可以将另一个计算变量添加到扩展名,也许称为displayString,就像这样
extension Float {
private var rounded: Float {
get{
return round(self*10)/10
}
}
var displayString: String {
get {
return "\(self.rounded)"
}
}
}
像这样使用
someColor.red.displayString
(我将其设为私有,因为在此实现中,除了检索displayString之外,您不需要它)
答案 1 :(得分:0)
String
属性向用户表示RGB值取而代之的是关注您希望为用户显示"四舍五入的值" ,重新将其重新表达为您希望String
代表您的red
,green
和blue
Float
值,您希望用它们以格式化的方式向用户展示值。
使用已存储的String
属性和属性观察器
你可以,例如使用三个存储的String
属性,这些属性使用属性观察器(willSet
)来跟踪Float
属性中的值:
struct Color {
private static func toString(num: Float) -> String {
return String(format: "%.02f", num)
}
var red: Float { willSet { strRed = Color.toString(num: newValue) } }
var green: Float { willSet { strGreen = Color.toString(num: newValue) } }
var blue: Float { willSet { strBlue = Color.toString(num: newValue) } }
var strRed: String
var strGreen: String
var strBlue: String
init(red: Float, green: Float, blue: Float) {
self.red = red
self.green = green
self.blue = blue
strRed = Color.toString(num: red)
strGreen = Color.toString(num: green)
strBlue = Color.toString(num: blue)
}
}
// Float values used in application
let color = Color(red: 0.111, green: 0.2099, blue: 0.235)
// String representation of these used to present
// the values to the user
print(color.strRed, color.strGreen, color.strBlue) // 0.11 0.21 0.23
使用计算出的String
属性
根据应用程序的不同,一种更明智的方法可能是让String
属性成为计算属性,然后随意计算它们。
struct Color {
private static func toString(num: Float) -> String {
return String(format: "%.02f", num)
}
var red: Float
var green: Float
var blue: Float
var strRed: String { return Color.toString(num: red) }
var strGreen: String { return Color.toString(num: green) }
var strBlue: String { return Color.toString(num: blue) }
init(red: Float, green: Float, blue: Float) {
self.red = red
self.green = green
self.blue = blue
}
}
let color = Color(red: 0.111, green: 0.2099, blue: 0.235)
print(color.strRed, color.strGreen, color.strBlue) // 0.11 0.21 0.23