发布于 2015-06-14 01:52:03 | 226 次阅读 | 评论: 0 | 来源: 网络整理
实例方法是被类型的某个实例调用的方法。你也可以定义类型本身调用的方法,这种方法就叫做类型方法。声明类的类型方法,在方法的func
关键字之前加上关键字class
;声明结构体和枚举的类型方法,在方法的func
关键字之前加上关键字static
。
注意:
在 Objective-C 里面,你只能为 Objective-C 的类定义类型方法(type-level methods)。在 Swift 中,你可以为所有的类、结构体和枚举定义类型方法:每一个类型方法都被它所支持的类型显式包含。
类型方法和实例方法一样用点语法调用。但是,你是在类型层面上调用这个方法,而不是在实例层面上调用。下面是如何在SomeClass
类上调用类型方法的例子:
class SomeClass {
class func someTypeMethod() {
// type method implementation goes here
}
}
SomeClass.someTypeMethod()
在类型方法的方法体(body)中,self
指向这个类型本身,而不是类型的某个实例。对于结构体和枚举来说,这意味着你可以用self
来消除静态属性和静态方法参数之间的歧义(类似于我们在前面处理实例属性和实例方法参数时做的那样)。
一 般来说,任何未限定的方法和属性名称,将会来自于本类中另外的类型级别的方法和属性。一个类型方法可以调用本类中另一个类型方法的名称,而无需在方法名称 前面加上类型名称的前缀。同样,结构体和枚举的类型方法也能够直接通过静态属性的名称访问静态属性,而不需要类型名称前缀。
下面的例子定义了一个名为LevelTracker
结构体。它监测玩家的游戏发展情况(游戏的不同层次或阶段)。这是一个单人游戏,但也可以存储多个玩家在同一设备上的游戏信息。
游戏初始时,所有的游戏等级(除了等级 1)都被锁定。每次有玩家完成一个等级,这个等级就对这个设备上的所有玩家解锁。LevelTracker
结构体用静态属性和方法监测游戏的哪个等级已经被解锁。它还监测每个玩家的当前等级。
struct LevelTracker {
static var highestUnlockedLevel = 1
static func unlockLevel(level: Int) {
if level > highestUnlockedLevel { highestUnlockedLevel = level }
}
static func levelIsUnlocked(level: Int) -> Bool {
return level <= highestUnlockedLevel
}
var currentLevel = 1
mutating func advanceToLevel(level: Int) -> Bool {
if LevelTracker.levelIsUnlocked(level) {
currentLevel = level
return true
} else {
return false
}
}
}
LevelTracker
监测玩家的已解锁的最高等级。这个值被存储在静态属性highestUnlockedLevel
中。
LevelTracker
还定义了两个类型方法与highestUnlockedLevel
配合工作。第一个类型方法是unlockLevel
:一旦新等级被解锁,它会更新highestUnlockedLevel
的值。第二个类型方法是levelIsUnlocked
:如果某个给定的等级已经被解锁,它将返回true
。(注意:尽管我们没有使用类似LevelTracker.highestUnlockedLevel
的写法,这个类型方法还是能够访问静态属性highestUnlockedLevel
)
除了静态属性和类型方法,LevelTracker
还监测每个玩家的进度。它用实例属性currentLevel
来监测玩家当前的等级。
为了便于管理currentLevel
属性,LevelTracker
定义了实例方法advanceToLevel
。这个方法会在更新currentLevel
之前检查所请求的新等级是否已经解锁。advanceToLevel
方法返回布尔值以指示是否能够设置currentLevel
。
下面,Player
类使用LevelTracker
来监测和更新每个玩家的发展进度:
class Player {
var tracker = LevelTracker()
let playerName: String
func completedLevel(level: Int) {
LevelTracker.unlockLevel(level + 1)
tracker.advanceToLevel(level + 1)
}
init(name: String) {
playerName = name
}
}
Player
类创建一个新的LevelTracker
实例来监测这个用户的发展进度。它提供了completedLevel
方法:一旦玩家完成某个指定等级就调用它。这个方法为所有玩家解锁下一等级,并且将当前玩家的进度更新为下一等级。(我们忽略了advanceToLevel
返回的布尔值,因为之前调用LevelTracker.unlockLevel
时就知道了这个等级已经被解锁了)。
你还可以为一个新的玩家创建一个Player
的实例,然后看这个玩家完成等级一时发生了什么:
var player = Player(name: "Argyrios")
player.completedLevel(1)
println("highest unlocked level is now (LevelTracker.highestUnlockedLevel)")
// 输出 "highest unlocked level is now 2"(最高等级现在是2)
如果你创建了第二个玩家,并尝试让它开始一个没有被任何玩家解锁的等级,那么这次设置玩家当前等级的尝试将会失败:
player = Player(name: "Beto")
if player.tracker.advanceToLevel(6) {
println("player is now on level 6")
} else {
println("level 6 has not yet been unlocked")
}
// 输出 "level 6 has not yet been unlocked"(等级6还没被解锁)