Swift中没有抽象类(就像Objective-C一样).最好的 Select 是使用Protocol,就像Java接口一样.
使用Swift 2.0,您可以使用协议扩展添加方法实现和计算(computed)属性实现.你唯一的限制是can't provide member variables or constants和there is no dynamic dispatch.
这种技术的一个例子是:
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
请注意,这甚至为 struct 提供了类似"抽象类"的特性,但类也可以实现相同的协议.
还要注意,每个实现Employee协议的类或 struct 都必须再次声明annualSalary属性.
最重要的是,注意there is no dynamic dispatch.当对存储为SoftwareEngineer
的实例调用logSalary
时,它将调用该方法的重写版本.当实例被转换为Employee
后调用logSalary
时,它会调用原始实现(即使实例实际上是Software Engineer
,它也不会动态地调度到重写版本).
有关更多信息,请查看WWDC关于该功能的精彩视频:Building Better Apps with Value Types in Swift