Swift 3.0 笔记 (2)

2017/03/02

字面量

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 字符串的字面量协议。支持私服穿的字面量协议要同时支持另外两个个协议。ExpressibleByExtendedGraphemeClusterLiteralExpressibleByUnicodeScalarLiteral

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和非nil
    • throw 错误处理 强制使用 do try catch、
    • let var 变量区分 可变与不可变
  • 效率
    • 范型 节省大量因类型不同而导致重复功能的代码
    • 语法简洁 函数式语法的支持,重载操作符,字面量
    • structenum 通常是静态调度或者内联调度方法并且在栈上生成,效率高还是安全值类型,
    • protocol extension 更强大的代码复用机制
  • 真实世界中的 Swift 性能优化

Post Directory