/**
* 实例方法
实例方法是属于某个特定类、结构体或者枚举类型实例的方法
*/
//class Counter{
// var count = 0
// func increment() {
// count+=1
// }
// func incrementBy(amount: Int) {
// count += amount;
// }
// func reset() {
// count = 0
// }
//}
//
调用
//let counter = Counter()
//counter.increment()
//counter.incrementBy(2)
//counter.reset()
//方法的局部参数名称和外部参数名称
/*
Swift 默认仅给方法的第一个参数名称一个局部参数名称;默认同时给第二个和后续的参数名称局部
参数名称和外部参数名称。这个约定与典型的命名和调用约定相适应,与你在写 Objective-C 的方法时很相 似。
这个约定还让表达式方法在调用时不需要再限定参数名称。
*/
//class Counter {
// var count: Int = 0
// func incrementBy(amount: Int, numberOfTimes: Int) {
// count = amount * numberOfTimes
// }
// //修改方法的外部参数名称
// func addcrementBy(anmount: Int,_ time:Int) {
// count = anmount + time;
// }
// func hhCrementBy(anmount: Int, Time time:Int) {
// count = anmount - time
// }
//}
定义
//var counter = Counter()
展示
//counter.incrementBy(3, numberOfTimes: 5);
修改方法的外部参数名称
//counter.addcrementBy(4, 6)
//counter.hhCrementBy(7, Time: 3)
//self 属性
/*
类型的每一个实例都有一个隐含属性叫做 self , self 完全等同于该实例本身。
你可以在一个实例的实例方法中 使用这个隐含的 self 属性来引用当前实例。
*/
/*
使用场景:
使用这条规则的主要场景是实例方法的某个参数名称与实例的某个属性名称相同的时候。
在这种情况下,参数名 称享有优先权,并且在引用属性时必须使用一种更严格的方式。这时你可以使用
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)
//if somePoint.isToTheRightOfX(1.0) {
// print("This point is to the right of the line where x == 1.0")
//}
// 打印输出: This point is to the right of the line where x == 1.0
//如果不使用 self 前缀,Swift 就认为两次使用的 x 都指的是名称为 x 的函数参数。
//在实例方法中修改值类型
/*
结构体和枚举是值类型。一般情况下,值类型的属性不能在它的实例方法中被修改。
但是,如果你确实需要在某个具体的方法中修改结构体或者枚举的属性,你可以选择 变异(mutating) 这个方 法,
然后方法就可以从方法内部改变它的属性;并且它做的任何改变在方法结束时还会保留在原始结构中。
方法 还可以给它隐含的 self 属性赋值一个全新的实例,这个新实例在方法结束后将替换原来的实例。
*/
//struct Point {
// var x = 0.0, y = 0.0
// mutating func moveByX(deltaX: Double, deltaY:Double){
// x += deltaX
// y += deltaY
// }
//}
//
//var somePoint = Point(x: 1.0, y: 1.0)
//somePoint.moveByX(2.0, deltaY: 3.0)
//print("now \(somePoint.x), \(somePoint.y)")
/*
注意:
不能在结构体类型常量上调用可变方法,因为常量的属性不能被改变,即使想改变的是常量的变量属性也 不行
*/
//let fixedPoint = Point(x: 3.0, y: 3.0)
//fixedPoint.moveByX(2.0, y: 3.0)
// 这里将会抛出一个错误
//可变方法能够赋给隐含属性 self 一个全新的实例。上面 Point 的例子可以用下面的方式改写
//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)
// }
//}
//新版的可变方法 moveByX(_:y:) 创建了一个新的结构(它的 x 和 y 的值都被设定为目标值)。调用这个版本的 方法和调用上个版本的最终结果是一样的。
//enum TriStateSwitch{
// case Off, Low, High
// mutating func next(){
// switch self {
// case Off:
// self = Low;
// case Low:
// self = High
// case High:
// self = Off
// }
// }
//}
//
//var stateSwitch = TriStateSwitch.Low
//stateSwitch.next()
//stateSwitch.next()