- 枚举 结构体 类都可以定义实例方法,类型方法
- 实例方法(
Instance Method
):通过实例对象调用
- 类型方法 (
Type Method
):通过类型调用,用static
或者class
关键字定义
self
- 在实例方法中代表实例对象
- 在类型方法中代表类型
- 在类型方法
static func getCount
中,count
等价于self.count
Car.self.count
Car.count
class Car {
static var count = 0
init() {
Car.count += 1
}
static func getCount() -> Int { count }//省略return
}
let c0 = Car()
let c1 = Car()
let c2 = Car()
print(Car.getCount())//3
print(Car.self.getCount())
mutating
- 结构体和枚举是值类型,默认情况下,值类型的属性不能被自身的实例方法修改
- 在
func
关键字前加mutating
可以允许这种修改行为
struct Point {
var x = 0.0 , y = 0.0
mutating func moveBy(deltaX: Double, deltaY: Double) {
x += deltaX
y += deltaY
//self = Point(x: x + deltaX, y: y + deltaY)
}
}
enum StateSwitch {
case low, middle ,high
mutating func next() {
switch self {
case .low:
self = .middle
case .middle:
self = .high
case .high:
self = .low
}
}
}
@discardableResult
- 在
func
前面加个@discardableResult
,可以消除:函数调用后返回值未被使用的警告
struct Point {
var x = 0.0 , y = 0.0
mutating func moveX(deltaX: Double) -> Double {
x += deltaX
return x
//self = Point(x: x + deltaX, y: y + deltaY)
}
}
var p = Point()
//警告:Result of call to 'moveX(deltaX:)' is unused
p.moveX(deltaX: 10)
struct Point {
var x = 0.0 , y = 0.0
@discardableResult mutating
func moveX(deltaX: Double) -> Double {
x += deltaX
return x
//self = Point(x: x + deltaX, y: y + deltaY)
}
}
var p = Point()
//使用@discardableResult修饰方法后课消除警告
p.moveX(deltaX: 10)
func get() -> Int {
return 10
}
//Result of call to 'get()' is unused
get()
@discardableResult
func get() -> Int {
return 10
}
//无警告
get()