1.private(set)
在var或subscript定义作用域之前,你可以通过private(set)或internal(set)先为它们的set权限申明一个较低的访问级别。
private(set) var userName: String?
虽然你可以在其他的源文件中实例化该类并且获取到userName属性的值,但是你不能对其进行赋值。就是说,你想用,可以直接拿去用。想知道值是怎么来的?对不起,你没权限。
2.required
如果子类需要添加异于父类的初始化方法时,必须先要实现父类中使用required修饰符修饰过的初始化方法。
class FatherClass {
var string :String
required init(string :String){
self.string = string
}
}
class SubClass: FatherClass {
init (i : Int){
super.init(string: String(i))
}
required init(string: String) {
fatalError("init(string:) has not been implemented")
}
}
这样父类的方法需要加required 并且子类也要写required 的这个方法 但是只是报错,告诉你,不好意思,父类的这个方法在我们子类不能用了,只能用我们子类的方法。(就好像国家制定个政策,告知美的政府,你可以不执行,当地政府制定一个自己的政策,在本地国家政策市行不通的)
let sub = SubClass(string: "la")
print("sub \(sub.string)")
对于上边的代码,如果你这样调用,是不行的。因为子类不允许父类的初始化方法执行了。
正确的方法应该是
let father = SubClass(i: 3)
print("father\(father.string)")
3.override
这是个重写方法。和上一条不同的是,父类方法子类调用,ok可以。但是我要重新制定下方法里做什么。
class FatherClass {
func description() -> String {
return "fatherClass description"
}
}
class SubClass: FatherClass {
override func description() -> String {
return "subClass description"
}
}
省厅说一人发10000块补助,县里拿到后重写了下方法,一人发了100。大概就是这个意思吧。
4.mutating
为了能在方法中改变属性的值
struct Point {
var x = 0, y = 0
mutating func moveXBy(x:Int,yBy y:Int) {
self.x += x
self.y += y
}
}
var p = Point(x: 5, y: 5)
p.moveXBy(3, yBy: 3)
在值类型的实例方法中,也可以直接修改self属性值。
5.convenience
convenience只作为补充和提供使用上的方便。所有的convenience初始化方法都必须调用同一个类中的designated初始化完成设置,另外convenience的初始化方法是不能被子类重写或从子类中以super的方式被调用的。
6.final
final 修饰符只能修饰类,表明该类不能被其他类集成,也就是它没资格当父亲 final不能修饰结构体和枚举