在Objective-C中,类是唯一能定义方法的类型,在Swift中可以灵活的在创建的类/结构体/枚举类型里定义方法
一、实例方法
实例方法是属于某个特定的类、结构体、枚举类型实例的方法
实例方法特性
1.可以访问和修改实例属性;
2.提供与实例目的相关的功能
▪实例方法要写在它所属的类型的前后大括号({})之间。
▪实例方法能够隐式访问它所属类型的所有的其他实例方法和属性。
▪ 实例方法只能被它所属的类的某个特定实例调用。
▪实例方法不能脱离于现存的实例而被调用。
实例方法中的self属性
类型的每一个实例都有一个隐含的属性self
,self完全等同于该实例本身
(与Objective-C中的类中的self相同,等同于实例本身)
在一个实例的实例方法中可以通过使用这个隐含的self属性来引用当前实例。
class Example {
let a: Int
let b: Int
let sum: Int
init(a: Int, b: Int) {
self.a = a
self.b = b
sum = a + b
print("Self 内: \(sum)")
}
func tot(c: Int) -> Int {
return sum - c
}
func result() {
print("结果为: \(tot(c: 20))")
print("结果为: \(tot(c: 50))")
}
}
调用
func instanceMethodsStudy (){
let pri = Example.init(a: 100, b: 200)
let sum = Example.init(a: 50, b: 60)
pri.result()
sum.result()
}
调用结果
Self 内: 300
Self 内: 110
结果为: 280
结果为: 250
结果为: 90
结果为: 60
在实例方法中修改值类型
Swift 语言中的结构体和枚举是值类型。一般情况下,值类型的属性不能在它的实例方法中被修改
当确实需要在某个具体的方法中修改结构体或者枚举的属性,可以选择变异
(mutating)
这个方法,然后方法就可以从方法内部改变它的属性
;并且它做的任何改变在方法结束时还会保留在原始结构中
。
方法还可以
给它隐含的self属性赋值一个全新的实例
,这个新实例在方法结束后将替换原来的实例
。
struct rectangularArea {
var length = 1
var breadth = 1
func area() -> Int {
return length * breadth
}
//通过mutating定义实例方法改变属性值
mutating func scaleBy(res: Int) {
//重写 length breadth值
length *= res
breadth *= res
print("当前length:\(length)")
print("当前breadth:\(breadth)")
}
}
调用
func mutatingStudy (){
var val = rectangularArea(length: 4, breadth: 6)
val.scaleBy(res: 2)
val.scaleBy(res: 20)
val.scaleBy(res: 200)
}
调用结果
当前length:8
当前breadth:12
当前length:160
当前breadth:240
当前length:32000
当前breadth:48000
在可变方法(mutating)
中给self赋值
struct rectangularArea {
var length = 1
var breadth = 1
func area() -> Int {
return length * breadth
}
mutating func scaleBy(res: Int) {
//重写 length breadth值
self.length *= res
self.breadth *= res
print("当前length:\(self.length)")
print("当前breadth:\(self.breadth)")
}
}
调用
func mutatingStudy (){
var val = rectangularArea(length: 4, breadth: 6)
val.scaleBy(res: 2)
}
调用结果
当前length:8
当前breadth:12
可变方法能够赋给隐含属性 self 一个全新的实例
二、类型方法
通过类型本身调用的方法就叫类型方法
声明结构体/枚举的类型方法,在func关键字前加
static
关键字
类会使用关键字
class
来允许子类重写父类的实现方法
类型方法调用
和实例方法一样
用点号(.)语法
调用
class MathFormula {
//声明类型方法
class func abs(number:Int) -> Int {
if number < 0
{
return (-number)
}else {
return number
}
}
}
struct absTurn
{
//用static关键字声明结构体的类型方法
static func abs(number: Int) -> Int
{
if number < 0
{
return (-number)
} else{
return number
}
}
}
调用
func classMethodsStudy (){
let no = MathFormula.abs(number: -35)
let num = absTurn.abs(number: -5)
print("获取绝对值结果no:\(no)")
print("获取反绝对值结果num:\(num)")
}
调用结果
获取绝对值结果no:86
获取反绝对值结果num:3
网友评论