一尘不染

Swift语言中的抽象类

swift

有没有一种方法可以用Swift语言创建抽象类,还是像Objective-C一样有局限性?我想创建一个与Java定义的抽象类相当的抽象类。


阅读 957

收藏
2020-07-07

共1个答案

一尘不染

Swift中没有抽象类(就像Objective-
C一样)。最好的选择是使用Protocol,就像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协议的类或结构都必须再次声明AnnualSalary属性。

最重要的是,请注意 没有动态调度
。在logSalary存储为的实例上调用when时,SoftwareEngineer它将调用该方法的重写版本。logSalary在将实例转换为an之后在实例上调用when时Employee,它将调用原始实现(即使实例实际上是,它也不会动态调度到覆盖版本Software Engineer

有关更多信息,请查看有关该功能的精彩WWDC视频:在Swift中使用值类型构建更好的应用程序

2020-07-07