在结构中显示数字舍入值的最佳方法

时间:2016-10-25 14:13:07

标签: swift performance struct

我正在寻找最有效的方法:

在我的应用程序中有一个名为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
}
}

我知道这对处理效率不利。我只是想学习良好的代码礼仪。

2 个答案:

答案 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代表您的redgreenblue 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