swift 类方法和实例方法 ,mutating

本文深入探讨Swift中的方法,包括实例方法和类型方法的概念及应用。详细介绍了如何通过实例方法操作值类型,以及如何定义和使用类型方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

// 方法是与某些特定类型相关联的函数。类,结构体,枚举都可以定义实例方法,实例方法为给定类型的实例封装了具体的任务与功能。类,结构体,枚举也可以定义类型方法,类型方法与类型本身相关联。类型方法与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
		}
	}
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值