Swift CGFloat 扩展

1. 引言

在 Swift 编程语言中,CGFloat 是一个定义了浮点数的数据类型,用于表示图形界面的尺寸、位置等信息。在编写 iOS 或 macOS 应用程序时,经常需要对 CGFloat 类型进行一些数学运算和转换。为了简化开发过程,我们可以通过扩展 CGFloat 类型,为其添加一些常用的方法和属性,使其更加灵活和便捷。本文将详细介绍如何扩展 CGFloat 类型,并给出一些实用的示例。

2. CGFloat 类型介绍

在 Swift 中,CGFloat 是一个定义了浮点数的数据类型,用于表示图形界面的尺寸、位置等信息。它可以存储浮点数的值,并支持基本的数学运算,如加减乘除等。CGFloat 类型的取值范围和精度取决于当前的系统架构,通常在 32 位系统上为单精度浮点数,而在 64 位系统上为双精度浮点数。

3. CGFloat 扩展示例

3.1. 基本数学运算

我们可以通过扩展 CGFloat 类型,为其添加基本的数学运算方法,如加法、减法、乘法和除法。

extension CGFloat {
    // 加法
    static func + (lhs: CGFloat, rhs: CGFloat) -> CGFloat {
        return lhs + rhs
    }
    
    // 减法
    static func - (lhs: CGFloat, rhs: CGFloat) -> CGFloat {
        return lhs - rhs
    }
    
    // 乘法
    static func * (lhs: CGFloat, rhs: CGFloat) -> CGFloat {
        return lhs * rhs
    }
    
    // 除法
    static func / (lhs: CGFloat, rhs: CGFloat) -> CGFloat {
        return lhs / rhs
    }
}

上述代码定义了四个基本的数学运算方法,通过在 CGFloat 类型上添加静态函数,我们可以直接使用加减乘除运算符对 CGFloat 类型进行运算。

3.2. 单位转换

在开发中,经常需要进行单位转换,例如将像素值转换为点值,或者将角度值转换为弧度值。我们可以通过扩展 CGFloat 类型,为其添加单位转换的方法。

extension CGFloat {
    // 像素转点
    var points: CGFloat {
        let scale = UIScreen.main.scale
        return self / scale
    }
    
    // 弧度转角度
    var degrees: CGFloat {
        return self * 180 / .pi
    }
}

上述代码定义了两个单位转换的属性。通过在 CGFloat 类型上添加计算属性,我们可以直接使用点语法来进行单位转换。

3.3. 常用数学函数

CGFloat 类型本身已经支持一些常用的数学函数,如绝对值、平方根、指数、对数等。但有时我们可能需要其他一些特定的数学函数,例如取整、四舍五入、向上取整、向下取整等。我们可以通过扩展 CGFloat 类型,为其添加这些常用的数学函数。

extension CGFloat {
    // 取整
    func rounded() -> CGFloat {
        return CGFloat(Int(self))
    }
    
    // 向上取整
    func ceil() -> CGFloat {
        return Foundation.ceil(self)
    }
    
    // 向下取整
    func floor() -> CGFloat {
        return Foundation.floor(self)
    }
}

上述代码定义了三个常用的数学函数,通过在 CGFloat 类型上添加实例方法,我们可以直接调用这些函数来对 CGFloat 类型进行操作。

4. 类图

下面是 CGFloat 类型及其扩展的类图:

classDiagram
    class CGFloat {
        - CGFloat(value: Double)
        - value: Double
        + static func + (lhs: CGFloat, rhs: CGFloat) -> CGFloat
        + static func - (lhs: CGFloat, rhs: CGFloat) -> CGFloat
        + static func * (lhs: CGFloat, rhs: CGFloat) -> CGFloat
        + static func / (lhs: CGFloat, rhs: CGFloat) -> CGFloat
        + var points: CGFloat
        + var degrees: CGFloat
        + func rounded() -> CGFloat
        + func ceil() -> CGFloat
        + func floor() -> CGFloat
    }
``