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

Swift协议继承和协议一致性问题

劳豪
2023-03-14
问题内容

protocol BasePresenterProtocol : class {}
protocol DashboardPresenterProtocol : BasePresenterProtocol {}

final class DashboardPresenter {
    weak var view: DashboardPresenterProtocol?

    init() {
        self.view = DashboardViewController()
    }

    func test() {
        print("Hello")
    }
}

extension DashboardPresenter: DashboardViewProtocol { }

protocol BaseViewProtocol : class {
    weak var view: BasePresenterProtocol? { get set }
}

protocol DashboardViewProtocol : BaseViewProtocol {
}

class DashboardViewController {
}

extension DashboardViewController: DashboardPresenterProtocol { }

在上面的代码中,我在下一行收到错误

extension DashboardPresenter: DashboardViewProtocol { }

DashboardPresenter但未确认协议DashboardViewProtocol,但我已weak var view: DashboardPresenterProtocol?在中声明DashboardPresenter。虽然我已经宣布

为什么会出现此错误?请让我知道我在这段代码中做错了什么。


问题答案:

您不能使用type BasePresenterProtocol?属性来实现type
的读写属性要求DashboardPresenterProtocol?

考虑这是否会发生什么
可能的,你上溯造型的一个实例,并DashboardPresenterDashboardViewProtocol。您将能够分配符合BasePresenterProtocol类型属性的任何内容,DashboardPresenterProtocol?这将是非法的。

因此,读写属性要求 _必须_是不变的(尽管值得注意的是,只读属性要求应该可以是协变的,但是当前不支持。



 类似资料:
  • 协议(Protocols)为方法,属性和其他需求功能提供了蓝图。 它为方法或属性骨架而不是实现。 通过定义类,函数和枚举,可以进一步完成方法和属性的实现。 协议的一致性满足了协议要求的方法或属性。 语法 协议也遵循与类,结构和枚举类似的语法 - 协议在类,结构或枚举类型名称之后声明。 单个和多个协议声明也是可以的。 如果定义了多个协议,则必须用逗号分隔。 当要为超类定义协议时,协议名称应使用逗号跟

  • 协议规定了用来实现某一特定功能所必需的方法和属性。 任意能够满足协议要求的类型被称为遵循(conform)这个协议。 类,结构体或枚举类型都可以遵循协议,并提供具体实现来完成协议定义的方法和功能。 语法 协议的语法格式如下: protocol SomeProtocol { // 协议内容 } 要使类遵循某个协议,需要在类型名称后加上协议名称,中间以冒号:分隔,作为类型定义的一部分。遵循

  • 现在的处理器都是多核处理器,并且每个核都带有多个缓存(指令缓存和数据缓存,见下图)。为什么需要缓存呢,这是因为CPU访问内存的速度比较慢,所以在CPU和内存之间加了个缓存以提高访问速度。既然每个核都有缓存,那么假设两个核或者多个核同时访问同一个变量时这些缓存是如何进行同步的呢(缓存细分为一个个缓存行),这就有了MESI协议。 MESI中的状态 CPU中每个缓存行(caceh line)使用4种状态

  • 现在的处理器都是多核处理器,并且每个核都带有多个缓存(指令缓存和数据缓存,见下图)。为什么需要缓存呢,这是因为CPU访问内存的速度比较慢,所以在CPU和内存之间加了个缓存以提高访问速度。既然每个核都有缓存,那么假设两个核或者多个核同时访问同一个变量时这些缓存是如何进行同步的呢(缓存细分为一个个缓存行),这就有了MESI协议。 MESI中的状态 CPU中每个缓存行(caceh line)使用4种状态

  • 问题内容: 当前的Xcode版本(10.2)有一个大问题。 有一个带有以下签名的类: 然后我们有另一个像这样的类,它具有一些附加的逻辑。 现在是棘手的部分… 我们在不同的模拟器和设备上构建和运行该应用程序,并且一切正常。然后,我们将应用程序存档,突然不再被解雇。对项目的彻底清理使我们能够重现该问题,而无需再次存档。 我想不出什么时候会发生这种情况。而且情况变得更糟,因为我发现更多类似的问题,即仅在

  • Git 可以使用四种主要的协议来传输资料:本地协议(Local),HTTP 协议,SSH(Secure Shell)协议及 Git 协议。 在此,我们将会讨论那些协议及哪些情形应该使用(或避免使用)他们。 本地协议 最基本的就是 本地协议(Local protocol) ,其中的远程版本库就是硬盘内的另一个目录。 这常见于团队每一个成员都对一个共享的文件系统(例如一个挂载的 NFS)拥有访问权,或