美文网首页
Swift 3.0 学习笔记之Methods

Swift 3.0 学习笔记之Methods

作者: WavesFisherman | 来源:发表于2016-12-07 14:14 被阅读0次

    Classes, structures, and enumerations can all define instance methods;

    Classes, structures, and enumerations can also define type methods。 In Objective-C, classes are the only types that can define methods,In Swift, you can choose whether to define a class, structure, or enumeration, and still have the flexibility to define methods on the type you create.

    Instance Methods   实例方法

    Class

    class Counter{

             var count=0

             func increment() {

                     count+=1

             }

             func increment(by amount:Int) {

                     count +=amount

             }

             func reset() {

                     count=0

             }

    }

    let counter=Counter()   // the initial counter value is 0

    counter.increment()     // the counter's value is now 1

    counter.increment(by:5)     // the counter's value is now 6

    counter.reset()     // the counter's value is now 0

    Struct

    struct Point{

              var x=0.0,y=0.0

              func isToTheRightOf(x:Double) ->Bool{

                      return self.x>x

              }

    }

    let somePoint=Point(x:4.0,y:5.0)

    if somePoint.isToTheRightOf(x:1.0)  {

           print("This point is to the right of the line where x == 1.0")

    }

    // Prints "This point is to the right of the line where x == 1.0"

    Modifying Value Types from Within Instance Methods  从实例方法中修改值类型

    struct Point{

              var x=0.0,y=0.0

              mutating func moveBy(x deltaX:Double,y deltaY:Double) { //mutating关键字被添加到其定义,以使其能够修改其属性。

                                     x +=deltaX

                                     y +=deltaY

              }

    }

    var somePoint=Point(x:1.0,y:1.0)

    somePoint.moveBy(x:2.0,y:3.0) // 改变实例属性

    print("The point is now at (\(somePoint.x),\(somePoint.y))") 

    // Prints "The point is now at (3.0, 4.0)"

    let fixedPoint=Point(x:3.0,y:3.0)

    fixedPoint.moveBy(x:2.0,y:3.0)

    // this will report an error 因为fixedPoint是个常量无法改变其实例属性

    Assigning to self Within a Mutating Method  重新改变自己

    struct Point{

              var x=0.0,y=0.0

              mutating func moveBy(x deltaX:Double,y deltaY:Double) {

                                    self=Point(x:x+deltaX,y:y+deltaY) //实例对象调用实例方法改变对象本身

              }

    }

    enum TriStateSwitch{

              case off,low,high

              mutating func next() {

                           switch self{

                                      case .off:

                                               self= .low

                                      case .low:

                                               self= .high

                                      case .high:

                                               self= .off

                           }

               }

    }

    var ovenLight=TriStateSwitch.low

    ovenLight.next()      // ovenLight is now equal to .high

    ovenLight.next()       // ovenLight is now equal to .off

    Type Methods   类方法

    class SomeClass{

              class func someTypeMethod() {

                                // type method implementation goes here

              }

    }

    SomeClass.someTypeMethod()

    struct LevelTracker{

              static var highestUnlockedLevel=1

              var currentLevel=1

              static func unlock( _ level:Int) { //类方法  操作的是类属性highestUnlockedLevel

                                if level>highestUnlockedLevel {

                                       highestUnlockedLevel=level

                                }

              }

              static func isUnlocked( _ level:Int)  -> Bool{ // 类方法 操作的是类属性highestUnlockedLevel

                                return level <= highestUnlockedLevel

              }

              @discardableResult  //忽略返回值的代码不一定是错误

              mutating func advance(to level:Int) ->Bool{ // 可修改的实例方法   操作的是实例属性

                                     if LevelTracker.isUnlocked(level)  { // 调用类方法

                                           currentLevel=level

                                           return true

                                     }else{

                                           return false

                                     }

              }

    }

    class Player{

             var tracker = LevelTracker()

             let playerName:String

             func complete(level:Int) {

                     LevelTracker.unlock(level+1) // 调用类方法

                     tracker.advance(to:level+1) // 调用实例方法

             }

             init(name:String) { //属性构造器

                    playerName=name

             }

    }

    var player=Player(name:"Argyrios")

    player.complete(level:1)

    print("highest unlocked level is now\(LevelTracker.highestUnlockedLevel)")

    // Prints "highest unlocked level is now 2"

    player=Player(name:"Beto")

    if player.tracker.advance(to:6)  {

            print("player is now on level 6")

    }else{

            print("level 6 has not yet been unlocked")

    }

    // Prints "level 6 has not yet been unlocked"

    相关文章

      网友评论

          本文标题:Swift 3.0 学习笔记之Methods

          本文链接:https://www.haomeiwen.com/subject/atsdmttx.html