在Swift中,类的成员变量(属性)如果不需要计算,但又想在给它赋一个新值之前(或者之后)执行一段代码,可以使用willSet 和 didSet来处理.例如下面的代码样例,三角形(triangle)的边长总是与四边形(square)的边长相同.
class TriangleAndSquare {
var triangle: EquilateralTriangle {
willSet {
square.sideLength = newValue.sideLength
}
}
var square: Square {
willSet {
triangle.sideLength = newValue.sideLength
}
}
init(size: Double, name: String) {
square = Square(sideLength: size, name: name)
triangle = EquilateralTriangle(sideLength: size, name: name)
}
}
var triangleAndSquare = TriangleAndSquare(size: 10, name: "another test shape")
triangleAndSquare.square.sideLength
triangleAndSquare.triangle.sideLength
triangleAndSquare.square = Square(sideLength: 50, name: "larger square")
triangleAndSquare.triangle.sideLength
类中的方法同Swift中的函数有明显的不同.函数中,参数名只能用在函数内部.但是在类的方法中,你可以在调用这个方法的时候可以使用参数名(除了方法的第一个参数).默认情况下,调用方法的的时候使用与方法同名的参数,当然也可以定义另一个名字来使用.
class Counter {
var count: Int = 0
func incrementBy(amount: Int, numberOfTimes times: Int) {
count += amount * times
}
}
var counter = Counter()
counter.incrementBy(2, numberOfTimes: 7)
处理选项值的时候,你可以使用?操作(就像方法/属性/索引标记一样).如果在?之前的值为空(nil),那么?之后的所有都将被忽略,并且整个表达式的值为空(nil).如果?之前的值不为空(nil),那么选项值将根据?之后的执行结果来确定.在这两种情况下整个表达式的值都是作为选项值.
let optionalSquare: Square? = Square(sideLength: 2.5, name: "optional square")
let sideLength = optionalSquare?.sideLength
在Swift中使用enum来创建枚举类型,枚举与类和其他类型一样,可有自己的方法.
enum Rank: Int {
case Ace = 1
case Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten
case Jack, Queen, King
func simpleDescription() -> String {
switch self {
case .Ace:
return "ace"
case .Jack:
return "jack"
case .Queen:
return "queen"
case .King:
return "king"
default:
return String(self.toRaw())
}
}
}
let ace = Rank.Ace
let aceRawValue = ace.toRaw()
EXPERIMENT // 练习题
Write a function that compares two Rank values by comparing their raw values.
// 编写一个函数,用来比较两个Rank 值,(通过比较它们的初始值).
在上面的例子中,枚举的初始值类型是int,因此只需要指定第一个初始值,后面的会按顺序赋值.也可以使用字符串或者浮点值来作为枚举的初始值类型.
通过使用toRaw 和fromRaw方法 可以在初始值与枚举值间转换.
if let convertedRank = Rank.fromRaw(3) {
let threeDescription = convertedRank.simpleDescription()
}
枚举成员的值是一个确切实际的值,并不是提供了另一种赋初始值方式.实际上,如果真的是一个无意义的初始值,你可以不必赋值.
enum Suit {
case Spades, Hearts, Diamonds, Clubs
func simpleDescription() -> String {
switch self {
case .Spades:
return "spades"
case .Hearts:
return "hearts"
case .Diamonds:
return "diamonds"
case .Clubs:
return "clubs"
}
}
}
let hearts = Suit.Hearts
let heartsDescription = hearts.simpleDescription()
EXPERIMENT //练习题
Add a color method to Suit that returns “black” for spades and clubs, and returns “red” for hearts and diamonds.
// 添加一个color的方法给Suit,如果是黑桃/梅花,返回值为black,如果是红心和方块,返回值为red
注意上面代码中使用枚举成员Hearts的两处地方:枚举中给hearts常量赋值,Hearts标识这个常量(因为没有指定明显的类型);在switch语句中,通过缩写.Hearts使用枚举(因为self已经是一个suit).值的类型明确的情况下,可以随意使用缩写方式.
Welcome to Swift (苹果官方Swift文档初译与注解五)---29~34页,布布扣,bubuko.com