在Swift中定义全局常量
让我们来看看所有可能的方式
所有应用都以一种或另一种方式定义全局常量。 有人认为所有常量都应该是全局常量的一部分,无论是仅在一个位置还是在多个位置使用它。 在开始时,一切看起来都不错,但是随着您的应用程序的增长,您将发现难以管理。 恕我直言,如果只在一个地方使用常量,最好不要创建全局常量。
您可以使用类型属性在类型上而不是在该类型的实例上定义常量。 要将类型属性声明为常量,只需使用static let
。 通常,以这种方式声明的类型属性优于全局常量,因为它们更容易与实例属性区分开。 让我们探索在多个地方使用全局常量时声明全局常量的方法:
使用结构
struct
是值类型,可用于定义常量。 您也可以使用嵌套struct
创建层次struct
。
结构常数{
静态让步宽度:CGFloat = 100
静态让高度:CGFloat = 100
}
常量可以这样访问:
Constants.width
嵌套结构将如下所示:
struct ConstantsStruct {
静态让行高度:CGFloat = 18
struct ContainerSize {
静态让步宽度:CGFloat = 100
静态让高度:CGFloat = 100
}
}
这种方法的缺点是,您最终会创建struct实例。
let instance = ConstantsStruct() // Useless, but legal
2. 使用无大小写的枚举:
为什么命名为不区分大小写的枚举?
通常,当有人谈论enum
,我们想到的是一个case
,在所有语言中都是相同的概念。 如果在enum
指定case
,则可以实例化它。 不区分大小写的枚举意味着您将不指定任何case
。 您将只指定类型属性。
enums
也是值类型,但无大小写的枚举不允许您创建实例。
枚举ConstantsEnum {
静态让步宽度:CGFloat = 100
静态让高度:CGFloat = 50
}
使用不区分大小写的枚举的优点是它不会被意外实例化并且可以用作纯名称空间。
如果尝试创建ConstantsEnum
实例,则将出现错误:
let instance = ConstantsEnum() // error: 'LayoutConstants' cannot be constructed because it has no accessible initializers
因此,如果您只是在寻找某些东西来充当某些静态成员的命名空间,则首选使用枚举,因为您不会意外地创建实例。
用法示例:
enum ConstantsEnum {
static let xxx = 500
enum xxxx {
static let .........
}
}
3. Swift扩展:
除了声明全局常量,我们可以扩展常量的类型。 当您在通知中心代码中传递键名时,此方法很有用。
扩展Notification.Name {
//通知
静态让customNotification = Notification.Name(“ customNotification”)
}
func postNotification(){
NotificationCenter.default.post(名称:.customNotification,对象:无)
}
隐式成员表达:
隐式成员表达式是在类型推断可以确定隐式类型的上下文中访问类型成员(例如枚举案例或类型方法)的方法。
扩展名Double {
公共静态让kRectX = 30.0
公共静态让kRectY = 30.0
公共静态让kRectWidth = 30.0
公共静态let kRectHeight = 30.0
}
公共功能makeRect()-> CGRect {
返回CGRect(x:.kRectX,y:.kRectY,宽度:.kRectWidth,高度:.kRectHeight)
}
在定义方法和属性时,Swift提供了对实例方法和属性的隐式访问,而没有“ self”前缀。 Swift隐式也适用于类方法,枚举用例,自动布局等。
Swift标准库中的示例:
公共静态让背景:DispatchQoS
公共静态让用户发起:DispatchQoS