/*
结构体和枚举是值类型,默认情况下,值类型的属性不能被自身的实例方法修改
在func关键字前加mutating可以允许修改
*/structPerson{var height=180,weight=140mutatingfuncgrow(_ h:Int,_ w:Int){
height += h
weight += w
//self=Person(height:height+h,weight:weight+w)}}var p =Person()
p.grow(5,5)print(p.height,p.weight)185145enumPerson{case child,old,young
mutatingfuncgrow(){switchself{case.child:self=.young
case.young:self=.old
case.old:self=.old
}}}var p=Person.child
p.grow()print(p)
young
1.3-@discardableResult(忽略警告)
/*
*///Result of call to 'getCount()' is unusedclassPerson{varcount=0
@discardableResult
funcgetCount()->Int{1}}var p =Person()
p.getCount()
@discardableResult
funcrun()->Int{//process10}run()
/*
类是引用类型可以直接修改,结构体是值类型所以要set
*/classPerson{var height=0,weight=0}classChild{var person =Person()subscript(index:Int)->Person{get{person}}}var c =Child()
c[0].height=180print(c[0].height,c[0].weight)1800structPerson{var height=0,weight=0}classChild{var person =Person()subscript(index:Int)->Person{set{person=newValue}get{person}}}var c =Child()
c[0].weight=140print(c[0].height,c[0].weight)0140
2.4-接受多个参数的下标
classMap{var data=[[0,1,2],[3,4,5],[6,7,8]]subscript(row:Int,col:Int)->Int{set{guard row>=0&& row<3&& col>=0&& col <3else{return}
data[row][col]=newValue
}get{guard row>=0&& row<3&& col>=0&& col <3else{return0}return data[row][col]}}}var m =Map()print(m[1,2])5
m[1,2]=55print(m.data)[[0,1,2],[3,4,55],[6,7,8]]
/*
*/classPerson{funcwalk(){print("person walk")}subscript(index:Int)->Int{return index
}}classChild:Person{overridefuncwalk(){super.walk()print("child walk")}overridesubscript(index:Int)->Int{returnsuper[index]+1}}var p:Person
p=Person()
p.walk()
person walk
print(p[3])3
p=Child()
p.walk()
person walk
child walk
print(p[3])4
3.4-重写类型方法、类型下标
/*
类方法既可用class来修饰,也可用static来修饰。
如果父类的类方法使用static修饰的话,子类不能重写这个类方法;
如果父类的类方法使用class修饰的话,子类能够重写这个类方法。
如果父类的类方法是使用final class修饰的话,子类不能重写这个类方法。
综上,static自带final class的性质。
你希望子类能够重写其父类的某个类方法,那就使用class修饰这个类方法。
你不希望子类能够重写其父类的某个类方法,那就使用static修饰这个类方法。
PS:
final class classMethod:可继承,但禁止子类重写其父类中的类方法
final intanceMethod:可继承,但禁止子类重写其父类中的对象方法
private:本类私有的方法或属性,子类不可继承
fileprivate:本文件私有的方法或属性,本文件外不可访问、继承
*/classPerson{classfuncwalk(){print("person walk")}classsubscript(index:Int)->Int{return index
}}classChild:Person{overrideclassfuncwalk(){super.walk()print("child walk")}overrideclasssubscript(index:Int)->Int{returnsuper[index]+1}}Person.walk()
person walk
print(Person[1])1Child.walk()
person walk
child walk
print(Child[1])2