Swift中的final修饰符
Swift中的final
修饰符可以防止类(class)被继承,还可以防止子类重写父类的属性、方法以及下标。需要注意的是,final
修饰符只能用于类,不能修饰结构体(struct)和枚举(enum),因为结构体和枚举只能遵循协议(protocol)。虽然协议也可以遵循其他协议,但是它并不能重写遵循的协议的任何成员,这就是结构体和枚举不需要final
修饰的原因。
final修饰符的几点使用原则
-
final
修饰符只能修饰类,表明该类不能被其他类继承,也就是它没资格当父类。 -
final
修饰符也可以修饰类中的属性、方法和下标,但前提是该类并没有被final修饰过。 -
final
不能修饰结构体和枚举。
代码示例
final class Train {
//Todo...
}
class MaglevTrain: Train { // 编译失败
//Todo...
}
上面代码中,因为Train类被final
修饰过,所以当MaglevTrain
类继承了Train
后,编译器会提示错误。
class Train {
final func method() {
//Todo...
}
}
class MaglevTrain: Train {
override func method() { // 编译失败
//Todo...
}
}
上面的代码中,因为Train
类中的method
方法被final
修饰过,所以当子类MaglevTrain
重写父类的method
方法时,编译器会提示错误。
原文出处:http://www.devtalking.com/articles/swift-final/
此处扩展延伸一下
添加一个final
修饰的单例方法
public final class Singleton {
public static let share = Singleton()
private init() {}
}
是不是很简单,才两句代码,对上面的代码进行解读会发现,static
在swift中有一个作用叫做 “类型范围作用域” ,当static
修饰了一个成员变量或者常量时,那么这个类就拥有了类属性,在OC当中大家都知道static
的作用是修饰静态变量,有很多相关文章此处不再详述。知道了static的作用,这样子我们就可以为类添加类属性
public final class Singleton {
var objName: String?
public static let share = Singleton()
private init() {}
public static var className: String?
}
修改了一下代码,对单例singleton
添加了对象属性objName
、类属性className
嗯!今天就到这里吧,发觉自己真不会写文章😔
大家还是看一下参考文章吧!
http://swifter.tips/static-class/
http://swift.gg/2017/01/10/dear-erica-singletons-and-property-observers/