类的定义
使用关键字class来定义,定义其内容包含属性和方法。
class Person{
var name:String = ""
var age:Int = 0
var sex:String = ""
func skill(){
print("哈牛逼")
}
}
实例化对象
let i = Person()
i.name="李白"
i.age=100
i.sex="男"
i.skill()
print(i.name)
print(i.age)
print(i.sex)
类是引用类型
let i2 = i //i2与i共用一个地址
i2.name = "赵子龙"
i2.age = 800
i2.sex = "男"
print(i.name)
print(i.age)
print(i.sex)
判断是否引用了同一个实例
print(i2===i)
let i3 = Person()
print(i3===i)
存储属性
存储属性就是存储特定的类的一个常量或者变量
class money{
//储存属性
var January:Double = 0.0
var February:Double = 0.0
}
let stu = money()
//调用储存属性
stu.January = 4000.6
stu.February = 6006.2
print(stu.January)
计算属性
1.计算属性不存储值而是提供了一个get和set来分别进行获取值和设置其他属性的值
2.get里必须要有return要不然执行不起来
3.set中的newValue是用来接收外界赋给的新值
4.只读计算属性:只提供get,没有set的,在写get的时候可以把get连同{}一起省略
class money2{
//储存属性
var January:Double = 0.0
var February:Double = 0.0
//计算属性
var averagemoney:Double{
//get:获取值
get{
return (January+February)/2
}
//set:赋值
set{
print("set被调用,\(newValue)")
}
}
}
let stu2 = money2()
stu2.January = 4000.6
stu2.February = 6006.2
//使用计算属性
print(stu2.averagemoney)
stu2.averagemoney = 66
只读计算属性
class money3{
//储存属性
var January:Double = 0.0
var February:Double = 0.0
//只读计算属性单一个get
var averagemoney2:Double{
get{
print("嘿")
return (January+February)*2
}
}
//只读计算属性可以省略get{}
var averagemoney3:Double{
print("hello")
return (January+February)*2
}
}
//只读计算属性
let stu3 = money3()
stu3.January = 4000.6
stu3.February = 6006.2
print(stu3.averagemoney2)
print(stu3.averagemoney3)
类属性
1.类属性与个体无关,不需要对类进行实例化就可以使用。
2.类属性使用关键字static
class money4{
//储存属性
var January:Double = 0.0
var February:Double = 0.0
//类属性
static var amount:Int = 88
}
//使用类属性
print(money4.amount)
懒储存属性
1.懒加载只会赋值一次,只有在第一次使用的时候,
才会执行闭包,然后把闭包返回值赋值给属性
2.懒加载通过在属性声明的前面加上lazy来标识
懒加载的使用方法:
lazy var 变量:类型 = {代码段}()
案例
class number{
var start:Int = 0
var end:Int = 999
lazy var count:Int = {
()->Int in
print("开始计算")
var num = 0
for i in self.start...self.end{
num = num+i
}
return num
}()
}
let range = number()
print(range.count)//只有第一次调用的时候执行闭包
print(range.count)
print(range.count)
懒加载的使用场景
class Location{
let latitude:Double
let longitude:Double
init(latitude:Double,longitude:Double){
self.latitude = latitude
self.longitude = longitude
}
lazy var address:String = {
return "xxxx"
}()
}
属性观察器
1.属性观察器可以用来监控和响应初始化的属性值变化
2.属性观察器包括willSet和didSet,其中属性值改变前会触发willSet,属性值改变后会触发didSet
属性观察器的特点:
1.给属性添加观察器必须要声明清楚属性类型,否则会报错
2.willSet可以带一个newName的参数,没有的话,该参数默认命名为newValue
3.didSet可以带一个oldName的参数,表示以前的属性,不带的话默认为oldValue
4.即使是设置的值和原来的值相同,willSet和didSet也会被调用
class Person{
//储存属性
var January:Double = 0.0
var February:Double = 0.0
var name:String = "lisi"{
willSet{
print("在willSet被使用的时候值是,\(newValue)")
}
didSet{
print("在didSet被使用时值是,\(oldValue)")
}
}
}
let stu = Person()
stu.name = "小花"
属性观察器的使用场景
class Machine{
let max = 30 //允许通过的最大电流
var current = 10 {
willSet{
if newValue < max{
print("正常赋值")
}
if newValue == max{
print("安全提示:当前达到了规定的最大电流。")
}
}
didSet{
if current > max{
print("安全提示:当前电流已经超过了最大电流不可通过,回到当初电流。")
current = oldValue
}
}
}
}
var p = Machine()
p.current = 20
p.current = 30
p.current = 100
print(p.current)