字面量类型
所谓字面量,就是指一段能表示特定类型的值(如字符串、布尔值)的值表达式。例如:
let number:Int = 6
let name: String = "Tom"
上面例子中,6、Tom 都是字面量。
所谓字面量类型,就是指支持通过字面量进行实例初始化的数据类型,如上面例子中的 Int、String 类型。
Swift 中的字面量类型有:
数值类型:Int、Double、Float 以及其相关类型(如 UInt、Int16、Int32等)
布尔值类型:Bool
字符串类型:String
组合类型:Array、Dictionary、Set
空类型:Nil
字面量协议
Swift 是如何让上述的数据类型具有字面量初始化的能力呢?答案是:实现指定的字面量协议。
所以,如果我们希望自定义的数据类型也能通过字面量进行初始化,只要实现对应的字面量协议即可。
Swift中的字面量协议主要有以下几个:
ExpressibleByNilLiteral // nil字面量协议
ExpressibleByIntegerLiteral // 整数字面量协议
ExpressibleByFloatLiteral // 浮点数字面量协议
ExpressibleByBooleanLiteral // 布尔值字面量协议
ExpressibleByStringLiteral // 字符串字面量协议
ExpressibleByArrayLiteral // 数组字面量协议
ExpressibleByDictionaryLiteral // 字典字面量协议
其中,ExpressibleByStringLiteral 字符串字面量协议还依赖于以下 2 个协议:
ExpressibleByUnicodeScalarLiteral
ExpressibleByExtendedGraphemeClusterLiteral
也就是说,实现 ExpressibleByStringLiteral 协议时,还需要实现其依赖的另外 2 个协议。
字面量协议实践
下面是自定义的结构体类型 Price,我们通过实现不同的字面量协议让它实现对应的字面量初始化功能:
struct Price {
var value: Double
init(_ value: Double) {
self.value = value
}
}
// 实现 CustomStringConvertible 协议,提供 description 方法
extension Price: CustomStringConvertible {
public var description: String {
return "Price(the value is \(value))"
}
}
// 实现 ExpressibleByFloatLiteral 字面量协议
extension Price: ExpressibleByFloatLiteral {
public init(floatLiteral value: FloatLiteralType) {
self.init(value)
}
}
// 实现 ExpressibleByIntegerLiteral 字面量协议
extension Price: ExpressibleByIntegerLiteral {
public init(integerLiteral value: IntegerLiteralType) {
self.init(Double(value))
}
}
// 实现 ExpressibleByStringLiteral 字面量协议
extension Price: ExpressibleByStringLiteral {
public init(stringLiteral value: StringLiteralType) {
if let doubleValue = Double(value) {
self.init(doubleValue)
} else {
self.init(0)
}
}
// 实现 ExpressibleByExtendedGraphemeClusterLiteral 字面量协议
public init(extendedGraphemeClusterLiteral value: StringLiteralType) {
if let doubleValue = Double(value) {