字面量
let a = Array<Int>([1,2,3])//Array 的初始化方法
let b = [1,2,3] //Array 支持实现了字面量协议:ExpressibleByArrayLiteral
let a = String("hello") //String 的初始化方法
let b = "hello" //String 支持实现了字面量协议:ExpressibleByStringLiteral
下面自己定一个类来支持 ExpressibleByStringLiteral 字符串的字面量协议。支持私服穿的字面量协议要同时支持另外两个个协议。ExpressibleByExtendedGraphemeClusterLiteral 和 ExpressibleByUnicodeScalarLiteral
public protocol ExpressibleByStringLiteral : ExpressibleByExtendedGraphemeClusterLiteral {
associatedtype StringLiteralType
public init(stringLiteral value: Self.StringLiteralType)
}
public protocol ExpressibleByExtendedGraphemeClusterLiteral : ExpressibleByUnicodeScalarLiteral {
associatedtype ExtendedGraphemeClusterLiteralType
public init(extendedGraphemeClusterLiteral value: Self.ExtendedGraphemeClusterLiteralType)
}
public protocol ExpressibleByUnicodeScalarLiteral {
associatedtype UnicodeScalarLiteralType
public init(unicodeScalarLiteral value: Self.UnicodeScalarLiteralType)
}
定义一个Person类
class Person {
let name: String
init(name value: String) {
self.name = value
}
}
class Person: ExpressibleByStringLiteral {
let name: String
init(name value: String) {
self.name = value
}
required convenience init(stringLiteral value: String) {
self.init(name: value)
}
required convenience init(extendedGraphemeClusterLiteral value: String) {
self.init(name: value)
}
required convenience init(unicodeScalarLiteral value: String) {
self.init(name: value)
}
}
let p: Person = "xiaoMing"
print(p.name)
// 输出:
// xiaoMing
这个Person类就可以支持 字面量的直接创建了。语义更清晰。代码更简单。
重载操作符
precedencegroup PowPrecedence {
associativity: right //结合律 eg:prefix | postfix
higherThan: MultiplicationPrecedence //优先级 eg:AdditionPrecedence
}
infix operator ^^: PowPrecedence
func ^^(lhs: Int, rhs: Int) -> Int {
let l = Double(lhs)
let r = Double(rhs)
let p = pow(l, r)
return Int(p)
}
print( 2^^3) //2 的 3次方 等于 8
递归枚举 关键字 indirect
indirect enum List<T>{
case Node(T, List)
}
枚举类型
Swift的优势
- 性能
- 比OC运行快1.3倍,密集运算时 仅次于C++。
静态类型编译期确定类型,用vtable直接绑定函数地址,不需要动态查找方法,即时报错。编译器优化更智能检测代码逻辑,eg:为循环体内的对象生成才有合适策略。
- 安全
可选值区分了nil和非nilthrow错误处理 强制使用 do try catch、let var变量区分 可变与不可变
- 效率
范型节省大量因类型不同而导致重复功能的代码语法简洁函数式语法的支持,重载操作符,字面量struct和enum通常是静态调度或者内联调度方法并且在栈上生成,效率高还是安全值类型,protocol extension更强大的代码复用机制
- 真实世界中的 Swift 性能优化