swift 类方法和实例方法 ,mutating

本文深入探讨Swift中的方法,包括实例方法和类型方法的概念及应用。详细介绍了如何通过实例方法操作值类型,以及如何定义和使用类型方法。
// 方法是与某些特定类型相关联的函数。类,结构体,枚举都可以定义实例方法,实例方法为给定类型的实例封装了具体的任务与功能。类,结构体,枚举也可以定义类型方法,类型方法与类型本身相关联。类型方法与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 中,调用类方法有以下几种情况: ### 类中的类方法调用 对于类定义的类方法,使用类名直接调用。以 `person` 类为例: ```swift class person { var _name: String = "kong" // 构造方法 init() { } init(name: String) { _name = name } // 实例方法 func sayHello() { print("say \(_name)") } // 类方法 class func sayHi() { print("class method") } } // 调用类方法 person.sayHi() ``` 这里通过 `person.sayHi()` 调用了 `person` 类的类方法 `sayHi()` [^2]。 ### 结构体中的静态方法调用 结构体中的静态方法同样使用结构体名直接调用。例如 `Ca` 结构体: ```swift struct Ca { var x: Int var y: Int // struct 是值类型,所有属性都是值类型,实例方法改变值类型属性,需要加 mutating mutating func inc(x: Int, _ y: Int) -> Int { self.x += x self.y += y return self.x + self.y } // 静态方法 static func staticMethod() { print("Static method in struct") } } // 调用静态方法 Ca.staticMethod() ``` ### 类中的静态属性静态方法调用 对于类中定义的静态属性静态方法,使用类名调用。如 `SomeClass` 类: ```swift class SomeClass { static var x = 1 var y = 0 // 实例方法可以调用静态属性 func inc(x: Int) { SomeClass.x += x } class func muti(y: Int) { x *= y // 静态方法不能调用实例属性 // self.y = y } } // 静态方法只能使用类名来调用 SomeClass.muti(2) print(SomeClass.x) ``` 通过 `SomeClass.muti(2)` 调用静态方法 `muti`,并使用 `SomeClass.x` 访问静态属性 [^3]。 ### Swift 类方法在 OC 类中的调用 如果要在 OC 类中调用 Swift 类方法,在 Swift 中定义类方法后,在 OC 类里按照类似 OC 之间的调用方式调用(记得编译一下)。例如 Swift 中定义: ```swift public static func swiftStaticFunc(log: NSString) { print(log) } ``` 在 `ViewController.m` 类里调用该方法 [^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值