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仍然处于锁定状态") }
时光见证了成长,还很无知,我想一点点幼稚转为有知!