这是我参与更文挑战的第12天,活动详情查看: 更文挑战
方法是与特定类型相关联的函数。
关于方法,Swift 和 OC 最主要的区别是,在Swift中,结构体和枚举都可以定义方法。
实例方法
-
实例方法
- 实例方法:属于特定类、结构体或枚举类型的实例的函数
- 实例方法与函数的语法相同
- 实例方法可以隐式访问该类型所有其他实例方法和属性,实例方法只能在其所属类型的特定实例上调用
class Student { var name = "" func gotoSchool() { print("\(name)去学校") } } let stu = Student() stu.name = "李雷" stu.gotoSchool() log: 李雷去学校 复制代码
-
self
属性- 类型的每个实例都有一个隐式属性
self
,它等同于实例本身。使用self
属性在其自己的实例方法中引用当前实例对象 - 大多数情况下,不需要在实例方法中使用
self
属性去引用该实例的属性或者调用其他方法,因为 Swift 会自动推断为当前类型的实例。但是当实例方法的某个参数名称与实例属性名称相同的时,参数名称优先级比较高,若是需要使用属性,则需要用self
来区分参数名称和属性名称
class Student { var name = "" func sayHI(name :String) { print("hello \(name),I am \(self.name)") } } let student = Student() student.name = "Li lei" student.sayHI(name: "hanmeimei") log: hello hanmeimei,I am Li lei 复制代码
- 类型的每个实例都有一个隐式属性
-
实例方法中修改值类型
结构体和枚举都是值类型。默认情况下,值类型的属性无法在其实例方法中修改。如果需要在特定方法中修改其属性,可以使用关键字
mutating
,将其放在枚举或结构体中所定义实例方法的func
关键字之前。当方法结束时,所做的任何更改都将写回原始数据结构中。该方法还可以为其隐式self
属性分配一个全新的实例,并且该self
所表示的新实例将在方法结束时替换现有实例- 结构体
struct Student { var name = "" mutating func changeName(name:String) { //赋值给隐式的self属性 self = Student.init(name: name) } } var student = Student.init(name: "lilei") print(student.name) student.changeName(name: "hanmeimei") print(student.name) log: lilei hanmeimei 复制代码
- 枚举
enum Color{ case red case yellow case green mutating func changeColor() { switch self { case .red: self = .yellow case .yellow: self = .green case .green: self = .red } } } var color = Color.red print(color) color.changeColor() print(color) log: red yellow 复制代码
类型方法
-
类型方法:使用类型本身而不是类型的实例去调用的方法。
-
在
func
关键字的前面加static
关键字,若当前的类型是类类型时,也可以使用class
关键字,对类类型使用class
关键字时,表示允许子类重写父类的方法 -
在类型方法中,隐式的
self
属性引用的是类型本身而不再是类型的实例。可以使用self
属性来消除类属性和类型方法参数之间的歧义class Student { static var name = "hanmeimei" class func sayHI(name :String) { print("hello \(name), I am \(self.name)") } } Student.sayHI(name: "lilei") log: hello lilei, I am hanmeimei 复制代码