zoukankan      html  css  js  c++  java
  • 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).值的类型明确的情况下,可以随意使用缩写方式.

     

  • 相关阅读:
    Zabbix 添加内存告警
    Oracle Drop 表数据恢复
    Kubernetes port-forward
    Jenkins指定tag发布到k8s环境
    Jenkins系列之六——拉取指定branch或tag
    MySQL5.7 报错 ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement
    docker部署常见应用
    Vim 中进行文件目录操作
    Oracle使用expdp/impdp迁移数据
    UmengAppDemo【友盟统计SDK集成以及多渠道打包配置,基于V7.5.3版本】
  • 原文地址:https://www.cnblogs.com/caios/p/3777036.html
Copyright © 2011-2022 走看看