实例方法
实例方法是属于某个类、结构体或枚举实例的函数。它们通过提供访问和修改实例属性的方式,或者提供与实例功能相关的操作,来支持实例的整体功能。
swift
class Counter {
var count = 0
// 实例方法
func increment() {
count += 1
}
func increment(by amount: Int) {
count += amount
}
func reset() {
count = 0
}
}
// 使用实例方法
let counter = Counter()
counter.increment() // count = 1
counter.increment(by: 5) // count = 6
counter.reset() // count = 0
方法参数可以同时拥有参数名称(在函数体内使用)和参数标签(在调用时使用)。例如
increment(by amount: Int)
中,by
是外部参数标签,amount
是内部参数名称。
self 属性
每个实例都有一个隐式的 self
属性,代表实例本身。在大多数情况下可以省略 self
,但当参数名与属性名冲突时必须显式使用:
swift
struct Point {
var x = 0.0, y = 0.0
func isToTheRightOf(x: Double) -> Bool {
return self.x > x // 使用 self 区分属性和参数
}
}
值类型的可变方法
结构体和枚举是值类型,默认不能在实例方法中修改属性。使用 mutating
关键字允许方法修改属性:
swift
struct Point {
var x, y: Double
mutating func moveBy(x deltaX: Double, y deltaY: Double) {
x += deltaX
y += deltaY
}
}
var point = Point(x: 1.0, y: 1.0)
point.moveBy(x: 2.0, y: 3.0) // (3.0, 4.0)
注意:不能在常量实例上调用可变方法。
可变方法还可以直接给 self
赋新值:
swift
mutating func moveBy(x deltaX: Double, y deltaY: Double) {
self = Point(x: x + deltaX, y: y + deltaY)
}
对于枚举的可变方法:
swift
enum TriStateSwitch {
case off, low, high
mutating func next() {
switch self {
case .off: self = .low
case .low: self = .high
case .high: self = .off
}
}
}
类型方法
使用 static
关键字定义类型方法(类可以用 class
关键字允许子类重写):
swift
class SomeClass {
class func someTypeMethod() { // 可被子类重写
print("Type method")
}
}
SomeClass.someTypeMethod() // 直接通过类型调用
类型方法中的 self
指类型本身,可以省略类型名前缀访问其他类型成员。
实际应用示例
游戏关卡跟踪系统:
swift
struct LevelTracker {
// 类型属性
static var highestUnlockedLevel = 1
// 类型方法
static func unlock(_ level: Int) {
if level > highestUnlockedLevel {
highestUnlockedLevel = level
}
}
static func isUnlocked(_ level: Int) -> Bool {
return level <= highestUnlockedLevel
}
// 实例属性
var currentLevel = 1
// 实例方法(可变)
@discardableResult
mutating func advance(to level: Int) -> Bool {
if LevelTracker.isUnlocked(level) {
currentLevel = level
return true
}
return false
}
}
class Player {
var tracker = LevelTracker()
let name: String
func complete(level: Int) {
LevelTracker.unlock(level + 1) // 解锁下一关
tracker.advance(to: level + 1) // 进入下一关
}
init(name: String) {
self.name = name
}
}
使用示例:
swift
let player = Player(name: "Alice")
player.complete(level: 1)
print(LevelTracker.highestUnlockedLevel) // 2
var newPlayer = Player(name: "Bob")
if newPlayer.tracker.advance(to: 3) {
print("进入第三关")
} else {
print("第三关尚未解锁") // 会执行这个
}
关键点总结
实例方法:
- 属于特定实例
- 可以访问和修改实例属性
- 通过点语法调用
self 使用:
- 隐式可用,用于区分同名属性和参数
- 值类型中可变方法可以给 self 赋新值
可变方法:
- 使用
mutating
关键字 - 允许修改值类型的属性
- 不能用于常量实例
- 使用
类型方法:
- 使用
static
或class
定义 - 通过类型名直接调用
- 可以访问类型属性/方法
- 使用
实际应用:
- 状态管理(如游戏关卡)
- 共享配置(通过类型属性)
- 工厂模式等
注意:Swift 的方法比 Objective-C 更灵活,不仅限于类,结构体和枚举也可以定义方法。