方法(Method)
枚举、结构体、类都可以定义实例方法、类型方法
实例方法(Instance Method):通过实例调用
类型方法(Type Method):通过类型调用,通过static或者class关键字定义
class Car {
/// 类型属性
static var count = 0
init() {
Car.count += 1
}
/// 类型方法
static func getCount() -> Int {
count
}
}
let c0 = Car()
let c1 = Car()
let c2 = Car()
print(Car.getCount()) // 3
通过观察可以看出类型方法里可以访问类型属性,如果将类型属性改为实例属性,就会报错:
原因是无论实例方法还是类型方法内部都有一个self,在实例方法中代表实例,在类型方法中代表类型,所以在类型方法中不能访问实例属性。
在类型方法static func getCount中,count等价于self.count、Car.self.count、Car.count
mutating
结构体和枚举是值类型,默认情况下,值类型的属性不能被自身的实例方法修改
在func关键字前加mutating可以允许这种修改行为
添加mutating修饰后,自身的实例方法就可以修改内部值类型属性了
struct Point {
var x: Double = 0
var y: Double = 0
mutating func move(toX: Double, toY: Double) {
x = toX
y = toY
}
}
@discardableResult
当函数调用时,没有使用返回值,就会产生警告
可以在func前面加个@discardableResult,可以消除:函数调用后返回值未被使用的警告
struct Point {
var x: Double = 0
var y: Double = 0
@discardableResult func test() -> Double {
return x + y
}
}
var p = Point()
p.test()