有没有办法用Swift语言创建一个抽象类,或者这和Objective-C一样是一个限制?我想创建一个与Java定义的抽象类类似的抽象类.

推荐答案

Swift中没有抽象类(就像Objective-C一样).最好的 Select 是使用Protocol,就像Java接口一样.

使用Swift 2.0,您可以使用协议扩展添加方法实现和计算(computed)属性实现.你唯一的限制是can't provide member variables or constantsthere 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

Swift相关问答推荐

如何使用swift宏生成一个带有关联值的枚举?

一种函数,用于判断变量的类型是否为在SWIFT中作为参数传递的类型

UICollectionViewCompostionalLayout Collectionview单元格宽度在重新加载数据后未正确调整大小

NavigationLink和ObservableObject的动画片段

SwiftUI 组合问题:通过 AppEventsManager 在 ViewModel 之间共享数据

如何在visionOS中将模型锚定在用户头部上方?

如何使用Swift宏和@Observable和@Environment?

在Equatable上引用运算符函数==要求Dictionary.Values符合Equatable

为什么即使 `C` 是一个不是 `Sendable` 的类,Task` 也能工作?

将 Encodable 扩展添加到 Swift 嵌套枚举

将基于MyProtocol的泛型函数的参数更改为使用存在的any MyProtocol或some MyProtocol是否会受到惩罚?

试图同时实现两个混合过渡

在 RealityKit 中创建转场

如何自己快速编写 Hashable 协议

swift:修改字典中的数组

在 Swift 中将两个字节的 UInt8 数组转换为 UInt16

SwiftUI 中的 .primary 和 .secondary colored颜色 是什么?

Swift if 语句 - 多个条件用逗号分隔?

如何使用 Swift 将文本文件逐行加载到数组中?

如何快速格式化用户显示(社交网络等)的时间间隔?