当前位置: 首页 > 面试题库 >

Swift语言中的抽象类

蒯宏达
2023-03-14
问题内容

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


问题答案:

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中使用值类型构建更好的应用程序



 类似资料:
  • 问题内容: 我想用一种快速的语言创建一个抽象函数。可能吗? 问题答案: Swift中没有抽象的概念(例如Objective-C),但是您可以这样做:

  • 根据我所学到的,抽象是一个隐藏内部实现的概念。 在Java中,我们可以通过接口、抽象关键字(类/方法)以及方法来实现抽象。例如扫描器s=新扫描器(System.in);int x=s.nextint();这里我们不需要了解nextInt()方法的任何内容。所以我可以说这是抽象。 同样的事情也可以在C语言中用printf()实现 所以,如果即使在非OOP语言中也能实现抽象,那么为什么在基于OOP的语

  • 中文版 Apple 官方 Swift 教程《The Swift Programming Language》 目录: 欢迎使用 Swift 关于 Swift(完成 By numbbbbb) Swift 初见(完成 By numbbbbb) Swift 教程 基础部分(完成 By numbbbbb, lyuka, JaySurplus) 基本操作符(完成 By @xielingwang) 字符串和字符

  • 来自Apple book“结构和类之间最重要的区别之一是,当结构在代码中传递时,它们总是被复制,而类是通过引用传递的。” 有谁能帮我明白那是什么意思吗?对我来说,类和结构似乎是一样的。

  • 问题内容: 如何在Swift语言中实现反射? 如何实例化课程 问题答案: 请注意,Swift类现在已命名为名称空间,因此它将是“ AppName.MyViewController”而不是“ MyViewController” 从XCode6-beta 6/7开始不推荐使用 使用XCode6-beta 3开发的解决方案 多亏了Edwin Vermeer的回答,我能够通过执行以下操作来构建一些东西来将

  • 介绍 我经常遇到这样一种情况,即库是用特定的编程语言编写的。这很好,如果我想用同一种语言使用这个库,但如果我想用另一种语言,那将是一个问题(这并不意味着可能会有或多或少的黑客方式) 对于一些库,我感觉它们是用特定的编程语言编写的,这仅仅是因为任何语言都可以(而且是因为作者个人的偏好),这意味着没有使用特定于语言的高级外部第三方库。对于这些情况,我认为如果有一种抽象(编程)语言,库作者可以用它来指定