如果你不需要计算属性但是需要在设置一个新值之前运行一些代码,使用willSet和didSet。 比如,下面的类确保三角形的边长总是和正方形的边长相同。 1. class TriangleAndSquare { 2. var triangle: EquilateralTriangle { 3. willSet { 4. square.sideLength = newValue.sideLength 5. } 6. } 7. var square: Square { 8. willSet { 9. triangle.sideLength = newValue.sideLength 10. } 11. } 12. init(size: Double, name: String) { 13. square = Square(sideLength: size, name: name) 14. triangle = EquilateralTriangle(sideLength: size, name: name) 15. } 16. } 17. var triangleAndSquare = TriangleAndSquare(size: 10, name: "another test shape") 18. triangleAndSquare.square.sideLength 19. triangleAndSquare.triangle.sideLength 20. triangleAndSquare.square = Square(sideLength: 50, name: "larger square") 21. triangleAndSquare.triangle.sideLength 类中的方法和一般的函数有一个重要的区别,函数的参数名只在函数内部使用,但是方法的参数名需要在调用的时候显式说明(除了第一个参数)。默认情况下,方法的参数名和它在方法内部的名字一样,不过你也可以定义第二个名字,这个名字被用在方法内部。 1. class Counter { 2. var count: Int = 0 3. func incrementBy(amount: Int, numberOfTimes times: Int) { 4. count += amount * times 5. } 6. } 7. var counter = Counter() 8. counter.incrementBy(2, numberOfTimes: 7) 处理变量的可选值时,你可以在操作(比如方法、属性和子脚本)之前加?。如果?之前的值是nil,?后面的东西都会被忽略,并且整个表达式返回nil。否则,?之后的东西都会被运行。在这两种情况下,整个表达式的值也是一个可选值。 1. let optionalSquare: Square? = Square(sideLength: 2.5, name: "optional square") 2. let sideLength = optionalSquare?.sideLength 枚举和结构体 使用enum来创建一个枚举。就像类和其他所有命名类型一样,枚举可以包含方法。 1. enum Rank: Int { 2. case Ace = 1 3. case Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten 4. case Jack, Queen, King 5. func simpleDescription() -> String { 6. switch self { 7. case .Ace: 8. return "ace" 9. case .Jack: 10. return "jack" 11. case .Queen: 12. return "queen" 13. case .King: 14. return "king" 15. default: 16. return String(self.toRaw()) 17. } 18. } 19. } 20. let ace = Rank.Ace 21. let aceRawValue = ace.toRaw() 练习:写一个函数,通过比较它们的原始值来比较两个Rank值。 在上面的例子中,枚举原始值的类型是Int,所以你只需要设置第一个原始值。剩下的原始值会按照顺序赋值。你也可以使用字符串或者浮点数作为枚举的原始值。 使用toRaw和fromRaw函数来在原始值和枚举值之间进行转换。 1. if let convertedRank = Rank.fromRaw(3) { 2. let threeDescription = convertedRank.simpleDescription() 3. } 枚举的成员值是实际值,并不是原始值的另一种表达方法。实际上,如果原始值没有意义,你不需要设置。 1. enum Suit { 2. case Spades, Hearts, Diamonds, Clubs 3. func simpleDescription() -> String { 4. switch self { 5. case .Spades: 6. return "spades" 7. case .Hearts: 8. return "hearts" 9. case .Diamonds: 10. return "diamonds" 11. case .Clubs: 12. return "clubs" 13. } 14. } 15. 16. } 17. let hearts = Suit.Hearts 18. let heartsDescription = hearts.simpleDescription()
|