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

方法其实就是函数,只不过方法是属于某个类、结构体、枚举类的函数。

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


实例方法(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,或者不加前缀。在类型方法里面是不能访问实例变量的。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值