Welcome to Swift (苹果官方Swift文档初译与注解五)---29~34页

在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页,,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。