定义全局常量

作为整个项目中通用的全局常量为了方便管理最好集中定义在一个地方.

下面介绍几种全局常量定义的姿势:

  1. 使用结构体
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    public struct Screen {
    static var width: CGFloat {
    return UIScreen.main.bounds.size.width
    }
    static var height: CGFloat {
    return UIScreen.main.bounds.size.height
    }
    static var statusBarHeight: CGFloat {
    return UIApplication.shared.statusBarFrame.height
    }
    }

    Screen.width // 屏幕宽度
    Screen.height // 屏幕高度
    Screen.statusBarHeight // statusBar高度

好处是能比较直观的看出全局常量的定义逻辑,方便后面扩展.


  1. 使用没有case的枚举
    正常情况下的enum都是与case搭配使用,如果使用了case就要实例化enum.其实也可以不写case.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public enum ConstantsEnum {
    static let width: CGFloat = 100
    static let height: CGFloat = 50
    }

    ConstantsEnum.width

    let instance = ConstantsEnum()
    // ERROR: 'ConstantsEnum' cannot be constructed because it has no accessible initializers
    ConstantsEnum不可以实例化,会报错.

相比struct,使用枚举定义常量可以避免不经意间实例化对象.


  1. 使用extension
    使用extension几乎可以为任何类型扩展常量.

例如,通知名称

1
2
3
4
5
6
public extension Notification.Name {
// 名称
static let customNotification = Notification.Name("customNotification")
}

NotificationCenter.default.post(name: .customNotification, object: nil)

增加自定义颜色

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public extension UIColor {
class var myGolden: UIColor {
return UIColor(red: 1.000, green: 0.894, blue: 0.541, alpha: 0.900)
}
}

view.backgroundColor = .myGolden
增加double常量

public extension Double {
public static let kRectX = 30.0
public static let kRectY = 30.0
public static let kRectWidth = 30.0
public static let kRectHeight = 30.0
}

CGRect(x: .kRectX, y: .kRectY, width: .kRectWidth, height: .kRectHeight)

因为传入参数类型是确定的,我们可以把类型名省略,直接用点语法.