您的位置:首页 > 移动开发 > Swift

Swift学习笔记11——方法(Method)

2015-10-04 13:39 357 查看
方法其实就是函数,只不过方法是属于某个类、结构体、枚举类的函数。

方法的定义和函数一样。调用通过点语法实现。注意,方法和属性不能同名。但是类型方法可以和实例方法重名。

实例方法(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,或者不加前缀。在类型方法里面是不能访问实例变量的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: