• swift结构体和类的实例方法和类型方法-006-


    //: Playground - noun: a place where people can play
    
    import UIKit
    
    //-----结构体和类的实例方法和类型方法--------//
    //方法就是定义在类,结构体,枚举中的函数
    //Swift中结构体和枚举都可以定义方法,是和C/OC的重大区别
    
    //实例方法(Instance Method):使用类、结构体、枚举的实例调用的方法
    //类型方法(Type Method):使用类、结构体、枚举类型本身调用方法
    
    //1.实例方法
    class SomeClass {
        
        func doSomething() {
            
            print("do Something")
            
        }
    }
    
    //创建类的实例
    let someClass = SomeClass()
    someClass.doSomething()
    
    //2.实例方法的多种形式
    class Timer {
        var count = 0
        
        //(1)无参无返回值
        func addOne() {
            
            count++
            print(count)
        }
        
        //(2)有参数,无返回值
        func addBy(amount:Int) {
            
            count += amount
            print(count)
        }
        
        //(3)有参数,并且指定参数的外部参数名
        func addValue(value amount:Int) {
            count += amount
            print(count)
        }
    
        //(4)多个参数,并且指定外部参数名
        func addTwoValue(para1 first:Int, para2 second:Int) {
            count += first
            count += second
            print(count)
        }
        
       
    }
    
    let timer = Timer()
    timer.addOne()
    timer.addBy(100)
    timer.addValue(value: 200)
    timer.addTwoValue(para1: 100, para2: 200)
    
    //3.self关键字
    //self在类中代表调用此方法的当前实例本身
    class Point {
        
        var x : Int = 10
        var y : Int = 10
        
        //(1)当属性名和参数名相同,用Self可以进行区分
        func setX(x : Int) {
            
            self.x = x
    
        }
        
        //(2)在类的某个方法中调用当前类中定义的其它方法,进行代码的复用
    }
    
    let myPoint = Point()
    myPoint.x = 20
    print(myPoint.x)
    
    
    //结构体和枚举中的self
    
    //(1)在结构体和枚举中对self的属性进行修改
    //值类型的属性不允许在其实例方法中被修改,给方法加上mutating关键字则可以在方法中修改实例的属性
    struct PointStruct {
        
        var x : Int = 10
        var y : Int = 10
        
        func isToTheRightOfX(x : Int) -> Bool {
            
            return self.x > x
        }
        
        mutating func moveByXAndY(deltaX:Int, deltaY:Int) {
            
            self.x += deltaX
            self.y += deltaY
        }
        
    }
    
    //创建结构体实例
    var somePoint = PointStruct()
    somePoint.moveByXAndY(10, deltaY: 20)
    print(somePoint)
    
    //(2)还可以对self直接进行修改
    struct Rect {
        
        var x = 0
        var y = 0
        var width = 50
        var height = 50
        
        mutating func replaceMe (new : Int) {
            
            self = Rect(x: new, y: new,  new, height: new)
            
            
        }
    }
    
    var newRect = Rect()
    newRect.replaceMe(100)
    print(newRect)
    
    
    //(3)在枚举中的使用
    enum WindFan {
        case Off,Low,High //风扇的三种状态
        
        mutating func next() {
            
            switch self {
            
            case .Off:
            self = Low
            
            case .Low:
            self = High
            
            case .High:
            self = Off
            }
            
        }
        
    }
    
    var wind = WindFan.Off
    wind.next()
    print(wind)
    
    //4.类型方法
    //类型方法的调用者为类型本身,不需要创建实例
    //结构体和枚举中使用static标识类型方法
    //类中使用class标识类型方法
    
    //需求:监测一个玩家他的游戏的进程(游戏的等级),可以存储多个玩家在同一个设备上的游戏信息。
    struct LevelTraker {
        
        //当前玩家游戏等级
        var currentLevel = 1
        
        //当前设备已解锁的最高等级,这个属性不是针对某个玩家,而是针对此设备的,定义成静态属性
        static var highestUnlockedLevel = 1
        
        //方法1:一旦新等级被解锁,就会更新最高等级的值
        static func unLockLevel(level: Int) {
            //只有类型方法中才能使用静态属性
            if level > highestUnlockedLevel {
                highestUnlockedLevel = level
            }
            
        }
        
        //方法2:如果给定的等级已经被解锁,则返回true,以便玩家进行判断
        static func levelIsUnlocked(level:Int) -> Bool {
            
            return level <= highestUnlockedLevel
            
        }
        
        //定义一个实例方法会在更新currentLevel之前检查所请求的新等级是否已被解锁,这个方法返回Bool值来判断是否能够更新当前用户的currentLevel
        mutating func advanceToLevel(level:Int) -> Bool {
            
            //类型方法可以直接用类型名调用,不需要创建实例
            if LevelTraker.levelIsUnlocked(level) {
                
                currentLevel = level
                
                return true
                
            } else {
                return false
            }
            
        }
    }
    
    class Player {
        
        var traker = LevelTraker()
        var playerName:String = ""
        
        func completeLevel(level:Int) {
            
            //更新最高等级-->调用类型方法
            LevelTraker.unLockLevel(level + 1)
            //更新当前玩家的currentLevel -->实例方法
            traker.advanceToLevel(level + 1)
        }
    }
    
    var player1 = Player()
    player1.playerName = "Kathy"
    
    player1.completeLevel(1)
    
    var player2 = Player()
    player2.playerName = "阿宝"
    
    if player2.traker.advanceToLevel(6){
        print("player现在可以开始第六个等级")
    } else {
        print("当前等级6仍然处于锁定状态")
    }
    时光见证了成长,还很无知,我想一点点幼稚转为有知!
  • 相关阅读:
    根据指定月份,打印该月份所属的季节
    求出1~100之间,既是3又是7的倍数的自然数出现的次数
    打印所有的水仙花数
    升景坊单间短期出租
    找出1000以内的所有完数
    ssh config host
    shell获取ip
    mongodb sharding 简单部署记录
    tcp转发
    openssl和Java的keytool证书相关的命令总结
  • 原文地址:https://www.cnblogs.com/foreveriOS/p/5566949.html
Copyright © 2020-2023  润新知