// 方法是与某些特定类型相关联的函数。类,结构体,枚举都可以定义实例方法,实例方法为给定类型的实例封装了具体的任务与功能。类,结构体,枚举也可以定义类型方法,类型方法与类型本身相关联。类型方法与OC中的类方法(class-method)相类似
// swift 和枚举 能够定义方法是swift 和 OC 主要区别之一。
// 实例方法:提供访问和修改实例目的相关的功能,并且以此来支撑实例的功能
class Counter
{
// 可变属性
var count = 0
// 实例方法1 自加
func increment() {
count += 1
}
// 实例方法2
func incrementBy(amount:Int,numberOfTimes:Int){
count += amount * numberOfTimes
print(count)
}
// 实例方法3 重置
func reset(){
}
}
// 在实例方法中修改值类型
/**
Modifying Value Types from Within Instance Methods
*/
// 结构体和枚举都是值类型,一般来讲,值类型的属性不能在它的实例方法中被修改,如果你确实要修改结构体或者枚举的属性,可以选择mutating 这个方法,这个方法从方法内部改变它的属性,并且它做的任何改变在方法结束时还会保留在原始结构中。方法还可以给它隐含的self属性赋值一个全新的实例。这个新的实例在方法结束后将替换原来的实例。要使用变异方法,将关键字mutating 放到方法的func关键字之前就可以了
struct Point{
var x = 0.0
var y = 0.0
// 以下方法 如果不加 mutating,关键字,会产生报错 Left side of mutating operator isn't mutable: 'self' is immutable
mutating func moveByX(deltaX:Double,deltaY:Double){
x += deltaX
y += deltaY
}
}
var somePoint = Point(x: 1.0, y: 1.0)
somePoint.moveByX(deltaX: 2.0, deltaY: 3.0)
// 输出 The point is now at (3.0,4.0)
print("The point is now at (\(somePoint.x),\(somePoint.y))")
// 枚举的变异方法
// 下面的例子中定义了一个三态开关的枚举,每一次调用next 方法的时候,开关在三种状态之间循环切换,因为要修改自身的变量 所以必须使用mutaing 关键字
enum TriStateSwitch{
// 枚举类型
case Off,Low,High
// 定义方法
mutating func next(){
switch self {
case .Off:
self = .Low
case .Low:
self = .High
case .High:
self = .Off
}
}
}
// 类型方法 Type Methods
// 实例方法是被类型的某个实例调用的方法,你也可以定义类型本身调用的方法,叫做类型方法
// 声明类的类型方法,在方法的func 关键字之前加上关键子class,声明结构体和枚举的类型方法,在方法的func 关键字之前加上关键字static
// 在类型方法的方法体(body)中,self 指向的是这个类型本身,而不是类型的某个实例
// 对于结构体和枚举来说,这意味着你可以用self 来消除静态属性和静态方法之间的歧义
struct LevelTracker{
static var highestUnlockedLevel = 1
static func unlockLevel(level:Int){
if level > highestUnlockedLevel{
highestUnlockedLevel = level
}
}
static func levelIsUnlocked(level:Int) -> Bool{
return level <= highestUnlockedLevel
}
var currentLevel = 1
mutating func advanceToLevel(level:Int) -> Bool{
if LevelTracker.levelIsUnlocked(level: level){
currentLevel = level
return true
}else{
return false
}
}
}
swift 类方法和实例方法 ,mutating
最新推荐文章于 2024-05-24 14:09:27 发布