Swift学习笔记11——方法(Method)
2015-10-04 13:39
357 查看
方法其实就是函数,只不过方法是属于某个类、结构体、枚举类的函数。
方法的定义和函数一样。调用通过点语法实现。注意,方法和属性不能同名。但是类型方法可以和实例方法重名。
实例方法(Instance Methods)
在实例方法里面具有 self 属性,该属性就是指这个实例本身。学习过java或OC的应该很熟悉。就是用来当参数名和属性名一样的时候,用来区分究竟是哪个变量。
如果是对于结构体,因为它是值传递,所以一般方法里面如果和上面一样尝试修改存储属性的值的话,是不允许的。直接报错。
如果需要修改,那么可以在方法前面加上mutating关键字,如下
上面changeVideo方法将整个self都赋值了一个新实例。
因为枚举类是不存在存储属性的,所以没有上面修改属性的情况。但是self关键字还是有的。
类型方法(Type Methods)
这个和类型属性一样,加上static或class就行了。class允许子类覆盖父类方法
注意,调用类型方法只能通过类名的点语法来实现,不能通过实例的点语法。这点和类型属性是一样的。
关于这个类型方法,需要注意里面的self和实例方法里面的self指向的不是用一个东西,前者是指类型本身,后者是指类型的实例。
所以在类型方法和实例方法里面访问类型变量和实例变量也有不同。在实例方法里面访问类型变量,需要加上类型前缀。 在类型方法里面访问类型变量,可以加上类型前缀,用self,或者不加前缀。在类型方法里面是不能访问实例变量的。
方法的定义和函数一样。调用通过点语法实现。注意,方法和属性不能同名。但是类型方法可以和实例方法重名。
实例方法(Instance Methods)
class Video { func play(videoName: String) { print("Now play",videoName) } } var v = Video() v.play("\"monkey king\"") //打印 Now play "monkey king"
在实例方法里面具有 self 属性,该属性就是指这个实例本身。学习过java或OC的应该很熟悉。就是用来当参数名和属性名一样的时候,用来区分究竟是哪个变量。
class Video { var videoName: String? func play(videoName: String) { self.videoName = videoName print("Now play",videoName) } } var v = Video() v.play("\"monkey king\"") print(v.videoName!) //打印 //Now play "monkey king" //"monkey king"
如果是对于结构体,因为它是值传递,所以一般方法里面如果和上面一样尝试修改存储属性的值的话,是不允许的。直接报错。
如果需要修改,那么可以在方法前面加上mutating关键字,如下
struct Video { var videoName: String? mutating func play(videoName: String) { self.videoName = videoName print("Now play",videoName) } mutating func changeVideo(newVideo: String){ self = Video(videoName: newVideo) } } var v = Video() v.play("\"monkey king\"") v.changeVideo("misson impossible") print(v.videoName!) //打印 //Now play "monkey king" //misson impossible
上面changeVideo方法将整个self都赋值了一个新实例。
因为枚举类是不存在存储属性的,所以没有上面修改属性的情况。但是self关键字还是有的。
类型方法(Type Methods)
这个和类型属性一样,加上static或class就行了。class允许子类覆盖父类方法
struct Video { var videoName: String? static var playTime: Int = 0 mutating func play(videoName: String) { self.videoName = videoName //这里是self指的是Video的实例 print("Now play",videoName) Video.playTime++ } mutating func changeVideo(newVideo: String){ self = Video(videoName: newVideo) } static func showPlayTime(){ print(self.playTime) //注意这里的self是指Video这个结构体,而不是实例 } } var v = Video() Video.showPlayTime() v.play("\"monkey king\"") Video.showPlayTime() //打印 //0 //Now play "monkey king" //1
注意,调用类型方法只能通过类名的点语法来实现,不能通过实例的点语法。这点和类型属性是一样的。
关于这个类型方法,需要注意里面的self和实例方法里面的self指向的不是用一个东西,前者是指类型本身,后者是指类型的实例。
所以在类型方法和实例方法里面访问类型变量和实例变量也有不同。在实例方法里面访问类型变量,需要加上类型前缀。 在类型方法里面访问类型变量,可以加上类型前缀,用self,或者不加前缀。在类型方法里面是不能访问实例变量的。
相关文章推荐
- Swift学习笔记10——属性(Properties)
- Swift 线程
- Swift 2.0 之map 与 zip
- Swift学习笔记9——类和结构体(Classes and Structures)
- Swift学习- 继承(十三)
- Swift学习笔记8——枚举类(Enumerations)
- swift map
- 【面试必备】Swift 面试题及其答案
- 寒哥带你深入了解下Swift中的Value Type
- Swift-循环控制新特性
- Swift - 元组的用法
- Swift 运算符
- Swift学习(二)
- Swift学习(一)
- Swift中的数据类型
- 7.Swift翻译教程系列——控制循环的流程
- swift基础学习篇发布时间调整
- swift 中switch 的新用法
- swift实现ios类似微信输入框跟随键盘弹出的效果
- swift的类和对象