// Methods are functions associate with types: Class, Structs and Enums
// 1. Type methods: like type properties, they are static and tied with Type
// 2. Instance methods: belong to specific instance
struct Count{
var count = 0
// stuct and enum are value types
// by default property of value type cannot be modified within it's
// instance methods. hence below you put a mutating keyword
mutating func increment() {
self.count += 1 // you can also put count += 1
}
mutating func increment(by count:Int){
self.count = self.count + count
// parameter take precedence when name are same
}
mutating func reset(){
count = 0
}
// u can create a new instance and assign it to self
mutating func assignNewCount(by startCount:Int){
self = Count(count : startCount)
}
}
// though you put mutating to amend the var property in Struct or Enum
// but if you assign it to a constant instance, you can't amend
// because it's value type and constant can't amend
let cantAmend = Count()
//cantAmend.increment()
enum Direction{
case Shang,Xia,Zuo,You
mutating func next(){
switch self {
case .Shang:
self = .Xia
case .Xia:
self = .Zuo
case .Zuo:
self = .You
case .You:
self = .Shang
}
}
}
var someDirection = Direction.Shang
print(someDirection)
someDirection.next()
print(someDirection)
// ************ Type methods AKA static/class methods *************
// 1. within Type methods, self refer to the Type
// 2. diff from inst methods, in type methods you call type propty directly
// example from guide
struct LevelTracker {
var currentLevel = 1
static var maxLevel = 1
static func unLock(_ level:Int){
if(level>maxLevel){
maxLevel=level
}
}
static func isUnlocked(_ level:Int) -> Bool {
return level <= maxLevel
}
// add mutating because you are about to amend struct property
mutating func advance(_ level: Int){
if(LevelTracker.isUnlocked(level)){ // because it's instance method
currentLevel = level
}
}
}
class Player {
var levelTracker = LevelTracker()
let playerName:String
init(name:String){
playerName = name // for instance method, you can omit self
}
func complete(_ level:Int){
LevelTracker.unLock(level+1)
levelTracker.advance(level+1)
}
}
var playerA = Player(name: "zhangsan")
var playerB = Player(name: "Lisi")
playerA.complete(3)
playerA.levelTracker.advance(2)
playerA.levelTracker.currentLevel
playerB.levelTracker.currentLevel
playerB.levelTracker.advance(2)
playerB.levelTracker.currentLevel