點擊查看源碼git
///方法 class Methods: NSObject { func test() { // self.testInstanceMethods() //實例方法 self.testTypeMethods() //類型方法 } //實例方法 func testInstanceMethods() { self.testLocalAndExternalParameterNames() self.testSelfProperty() self.testModifyingValueTypesFromWithinInstanceMethods() self.testAssigningToSelfWithinMutatingMethod() } //內部和外部屬性 func testLocalAndExternalParameterNames() { class Counter { var count: Int = 0 func incrementBy(_ amount: Int, numberOfTimes: Int) { count += amount * numberOfTimes } } let counter = Counter() counter.incrementBy(5, numberOfTimes: 3) print("\(counter.count)") /* print 15 */ } //self屬性 func testSelfProperty() { //self屬性 struct Point { var x = 0.0, y = 0.0 func isToTheRightOfX(_ x: Double) -> Bool { //這裏有內部和外部屬性 return self.x > x } } let somePoint = Point(x: 4.0, y: 5.0) print("\(somePoint.isToTheRightOfX(1.0))") /* true */ } //在實例方法中修改值類型 func testModifyingValueTypesFromWithinInstanceMethods() { //由於結構體是值對象,其內部方法沒法修改外部值,爲了讓結構體支持修改結構體內的屬性。 //方法體前加mutating,讓結構體的實例方法能夠修改結構體中的值 struct Point { var x = 0.0, y = 0.0 mutating func moveByX(_ deltaX: Double, y deltaY: Double) { x += deltaX y += deltaY } } var somePoint = Point(x: 1.0, y: 1.0) somePoint.moveByX(2.0, y: 3.0) print("(\(somePoint.x), \(somePoint.y))") let fixedPoint = Point(x: 3.0, y: 3.0) print(fixedPoint) // 結構體是值對象,使用let常量後,沒法修改內部值 // fixedPoint.moveByX(2.0, y: 3.0) // 拋錯 /* print (3.0, 4.0) (Point #1)(x: 3.0, y: 3.0) */ } //自我變異 func testAssigningToSelfWithinMutatingMethod() { //mutating還能夠修改當前結構體和當前枚舉 //結構體測試 struct Point { var x = 0.0, y = 0.0 mutating func moveByX(_ deltaX: Double, y deltaY: Double) { self = Point(x: x + deltaX, y: y + deltaY) } } var point = Point() point.moveByX(1.0, y: 1.0) print(point) //枚舉測試 enum TriStateSwitch { case off, low, high mutating func next() { switch self { case TriStateSwitch.off: self = TriStateSwitch.low print(self) case TriStateSwitch.low: self = TriStateSwitch.high print(self) case TriStateSwitch.high: self = TriStateSwitch.off print(self) } } } var ovenLight = TriStateSwitch.low ovenLight.next() ovenLight.next() /* (Point #1)(x: 1.0, y: 1.0) high off */ } //類型方法 func testTypeMethods() { //類 class SomeClass { class func someTypeMethod() { // type method implementation goes here } } SomeClass.someTypeMethod() // 結構體 struct LevelTracker { // static修改屬性,方法體要修改static屬性,方法前要使用static static var highestUnlockedLevel = 1 static func levelIsUnlocked(_ level: Int) -> Bool { return level <= highestUnlockedLevel } } print("\(LevelTracker.levelIsUnlocked(2))") /* false */ } }