indirect enum ArithmeticExpression { case Number(Int) case Addition(ArithmeticExpression, ArithmeticExpression) case Multipliation(ArithmeticExpression, ArithmeticExpression) }
func evaluate(expression: ArithmeticExpression) -> Int { switch expression { case .Number(let value): return value case .Addition(let left, let right): return evaluate(left) + evaluate(right) case .Multipliation(let left, let right): return evaluate(left) * evaluate(right) } }
//计算 ( 5 + 4 ) * 2 let five = ArithmeticExpression.Number(4) let four = ArithmeticExpression.Number(5) let sum = ArithmeticExpression.Addition(five, four) let product = ArithmeticExpression.Multipliation(sum, ArithmeticExpression.Number(2)) print(evaluate(product)) //输出结果 18
struct FixedLengthRange { var firstValue: Int let length: Int } var rangeOfThreeItems = FixedLengthRange(firstValue: 0, length: 3) // 该区间表示整数0,1,2 rangeOfThreeItems.firstValue = 6 // 该区间现在表示整数6,7,8
延迟存储属性
延迟存储属性是指当第一次被调用的时候才去计算初始值的属性。使用lazy修饰,例如:
1 2 3
lazy var importer = DataImporter() // 耗时操作,用到的时候再去创建。
class StepCounter { //添加两个观察器 var totalSteps: Int = 0 { willSet(newTotalSteps) { print("About to set totalSteps to \(newTotalSteps)") } didSet { if totalSteps > oldValue { print("Added \(totalSteps - oldValue) steps") } } } } let stepCounter = StepCounter() stepCounter.totalSteps = 200 // About to set totalSteps to 200 // Added 200 steps stepCounter.totalSteps = 360 // Added 160 steps stepCounter.totalSteps = 896 // About to set totalSteps to 896 // Added 536 steps