写在前面
swift中结构体和 枚举 也能够定义方法,这是swift和OC的主要区别之一。在OC中类是唯一能定义方法的类型。但是在swift中类,结构体,枚举中都可以定义方法。
一、实例方法(Instance Methods)
实例方法是属于某个特定类、结构体或者枚举类型实例的方法。实例方法提供访问和修改实例属性的方法或提供与实例目的相关的功能。如:
class Person {
let name = "lisi"
func sleep() {
print("\(name) sleep--")
}
func walk(from:String,to:String) {
print("\(name) walk from \(from) to \(to)")
}
func run(_ from:String,to:String) {
print("")
}
}
Person类定义了三个方法:
1.sleep
2.walk
3.run
此外Person类还声明了一个常量:name用来记录人的姓名
方法的调用使用 . 语法:
let p = Person()
p.walk(from: "home", to: "school")
p.sleep()
一、方法的局部参数名和外部参数名
函数参数可以同时有一个局部名称(在函数内部使用)和一个外部名称(在调用函数时使用)。
函数参数从第一个参数开始必须指定参数名(既是局部名称又是外部名称),除非使用 “_”指出省略外部参数名。
// 在调用的时候可以返现局部参数名和外部参数名的区别
p.run("home", to: "school")
p.walk(from: "home", to: "school")
以上使用 _ 忽略了 run 方法的第一个参数的外部参数名。
二、self属性
类型的每一个实例都有一个隐含的属性叫做self。self完全等同于该实例本身。可以使用self属性来引用当前实例。
var age = 1
func growUp() {
self.age += 1
}
注意:当参数的名字和实例属性名字有冲突(重名)的时候,参数名称享有优先权,此时就需要使用 self来区分参数名称和属性名称。
let name = "lisi"
func sayHelloTo(name:String) {
print("\(self.name) say hello to \(name)")
}
三、在实例方法中修改值类型
结构体和枚举是值类型,一般情况下值类型的属性不能再他的实例方法中被修改。但是如果确实需要在某个方法中修改结构体或者枚举的的属性,可以在方法前添加 mutating 即可。
struct Point {
var x = 0,y = 0
mutating func moveByX(deltaX: Int,deltaY: Int) {
x += deltaX
y += deltaY
}
}
// 这样写会报错
let point = Point()
point.moveByX(deltaX: 2, deltaY: 2)
注意:不能在结构体类型常量上调用变异(mutating)方法,因为常量的属性是不能被改变的,即使想修改的是常量(实例)的变量属性也不行(有点拗口)。
把上面的 let point = Point()改成 var point = Point()就可以了。
四、在变异方法中给self赋值
变异方法能够付给self一个全新的实例(原因终归:加了mutating后可以修改值类型的属性了,也就可以修改self)。上面的Point结构体可以这样写:
struct Point {
var x = 0,y = 0
mutating func moveByX(deltaX: Int,deltaY: Int) {
self = Point(x: x + deltaX,y: y + deltaY)
}
}
调用这个方法可以调用上面的方法结果是一样的。
再例如:
enum switchStatus {
case on,off
mutating func change() {
switch self {
case .on:
self = .off
case .off:
self = .on
}
}
}
上面定义了一个开关的枚举,每次调用change 方法时,开关的状态就会在on和off之间切换。
二、类型方法
实例方法是被某个类型的实例调用的方法。也可以定义类型本身调用的方法,这种方法就叫类型方法。声明类的类型方法:在方法的 func 关键字之前加上关键字 class ,声明结构体和枚举的类型方法时在方法的 func 关键字之前加上关键字 static。
关于static和class更深层次的讲解可以看 http://swifter.tips/static-class/
注意:在OC中你只能为OC的类定义类型方法(类方法)。在swift中你可以为所有的类、结构体和枚举类型定义类型方法。每一个类型方法都被他所支持的类型显示包含。
类型方法和实例方法一样使用 . 语法调用 。但是实在类型的层面上滴啊用这个方法。在类型方法中 self指向这个类型本身(在实例方法中 self指向实例)。同样你也可以使用self来消除类型方法中属性和参数重名造成的歧义问题。
以上参考《swift基础教程》
来源:oschina
链接:https://my.oschina.net/u/2604520/blog/789750