//: Playground - noun: a place where people can play
import UIKit
// # 实例方法
// 根据闭包的捕获性质,实例方法默认可以访问同类下所有其他实例方法和属性。实例方法只能在类型的具体实例里被调用。它不能独立于实例而被调用。
// self完完全全与实例本身相等,可以在当前实例中调用实例本身
// 默认情况下,值类型(struct, enum)属性不能被自身的实例方法修改。
// 添加了mutating关键字后,方法可以修改实例中的属性,还可以赋新值给实例本身.当然如果实例本身标注了let,那就都无法修改了
struct Point {
var x = 0.0, y = 0.0
mutating func moveBy(x deltaX: Double, y deltaY: Double) {
let new = Point(x: x + deltaX, y: x + deltaY)
self = new
}
}
// 在枚举中改变self
var somePoint = Point(x: 1, y: 1)
somePoint.moveBy(x: 1, y: 1)
enum TriStateSwitch {
case off, low, high
mutating func next() {
switch self {
case .off:
self = .low
case .low:
self = .high
case .high:
self = .off
}
}
}
var ovenLight = TriStateSwitch.low
ovenLight.next()
ovenLight.next()
// # 类型方法
// func前标注static
// 可以用调用类型方法的方式来调用init
class Human {
var isBeauty: Bool
init(isBeauty: Bool) {
self.isBeauty = isBeauty
}
}
var susan = Human.init(isBeauty: true)
var lily = Human(isBeauty: false)
// 使用 class关键字来允许子类重写父类对类型方法的实现。实例方法本来就随便重写所以不用标注class
class SomeClass {
class func someTypeMethod() {
// type method implementation goes here
}
class var sw: Int {
return 0
}
}
SomeClass.someTypeMethod()
SomeClass.sw
// 一个类型方法可以使用方法名调用另一个类型方法,并不需要使用类型名字作为前缀。如果在其他情况,比如类型内的实例属性和方法,或类型外,都要加上类型名前缀.
网友评论