在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
在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).值的类型明确的情况下,可以随意使用缩写方式.
|
请发表评论