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, width: 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仍然处于锁定状态")
}

 

posted on 2016-06-07 14:49  爱你久久iOS  阅读(364)  评论(0编辑  收藏  举报

导航