Swift 中没有抽象类(就像 Objective-C 一样)。您最好的选择是使用 规定,它类似于 Java 接口。
使用 Swift 2.0,您可以使用协议扩展添加方法实现和计算属性实现。你唯一的限制是你的 不能提供成员变量或常数和 没有克劳斯·福尔曼。
这种方法的一个例子是:
protocol Employee {
var annualSalary: Int {get}
}
extension Employee {
var biweeklySalary: Int {
return self.annualSalary / 26
}
func logSalary() {
print("$\(self.annualSalary) per year or $\(self.biweeklySalary) biweekly")
}
}
struct SoftwareEngineer: Employee {
var annualSalary: Int
func logSalary() {
print("overridden")
}
}
let sarah = SoftwareEngineer(annualSalary: 100000)
sarah.logSalary() // prints: overridden
(sarah as Employee).logSalary() // prints: $100000 per year or $3846 biweekly
请注意,即使对于结构,这也提供了类似于“抽象类”的特性,但是类也可以实现相同的协议。
还要注意的是,实现 Employee 协议的每个类或结构都必须再次声明 year Salary 属性。
class Element:CALayer { // IT'S ABSTRACT CLASS
override init(){
super.init()
if self.dynamicType === Element.self {
fatalError("Element is abstract class, do not try to create instance of this class")
}
}
}
required init?(coder aDecoder: NSCoder) {
guard type(of: self) != Weather.self else {
fatalError("<Weather> This is an abstract class. Use a subclass of `Weather`.")
}
// Initialize...
}
将对 Base 类的抽象属性和方法的所有引用移动到协议扩展实现,其中 Self 约束移动到 Base 类。您将获得对 Base 类的所有方法和属性的访问权限。另外,编译器检查派生类的协议中抽象方法和属性的实现
protocol Commom:class{
var tableView:UITableView {get};
func update();
}
class Base{
var total:Int = 0;
}
extension Common where Self:Base{
func update(){
total += 1;
tableView.reloadData();
}
}
class Derived:Base,Common{
var tableView:UITableView{
return owner.tableView;
}
}