字面量(Literal)
上面代码中的10、false、"Jack"就是字面量
- 常见字面量的默认类型
- public typealias IntegerLiteralType = Int
- public typealias FloatLiteralType = Double
- public typealias BooleanLiteralType = Bool
- public typealias StringLiteralType = String
- Swift自带的绝大部分类型,都支持直接通过字面量进行初始化
- Bool、Int、Float、Double、String、Array、Dictionary、Set、Optional等
字面量协议
- Swift自带类型之所以能够通过字面量初始化,是因为它们遵守了对应的协议
- Bool : ExpressibleByBooleanLiteral
- Int : ExpressibleByIntegerLiteral
- Float、Double : ExpressibleByIntegerLiteral、ExpressibleByFloatLiteralp
- Dictionary : ExpressibleByDictionaryLiteral
- String : ExpressibleByStringLiteral
- Array、Set : ExpressibleByArrayLiteral
- Optional : ExpressibleByNilLiteral
示例各种类型的字面量赋值及遵守何种协议:
字面量协议应用
- 有点类似于C++中的转换构造函数
示例1:传入Bool返回Int
extension Int: ExpressibleByBooleanLiteral {
public init(booleanLiteral value: Bool) {
self = value ? 1 : 0
}
}
var num: Int = true
print(num) //输出1
num = false
print(num) //输出0
示例2: 给类对象赋字面量
其中ExpressibleByStringLiteral遵守ExpressibleByUnicodeScalarLiteral和ExpressibleByExtendedGraphemeClusterLiteral协议,最后两个init就属于这两个协议的。(比如"?"这种特殊字符)
示例3: 同时遵守数组协议和字典协议
struct Point {
var x = 0.0, y = 0.0
}
extension Point: ExpressibleByArrayLiteral, ExpressibleByDictionaryLiteral {
//...代表可变参数
init(arrayLiteral elements: Double...) {
guard elements.count > 0 else { return }
self.x = elements[0]
guard elements.count > 1 else { return }
self.y = elements[1]
}
init(dictionaryLiteral elements: (String, Double)...) {
for(k, v) in elements {
if k == "x" {self.x = v}
else if k == "y" {self.y = v}
}
}
}
var p: Point = [10.5, 20.5]
print(p) //输出Point(x: 10.5, y: 20.5)
p = ["x": 11, "y": 12]
print(p) //输出Point(x: 11.0, y: 12.0)