我很难理解这种模块间通信.我的应用程序使用了3个模块.

我们称它们为模块A、模块B和模块C.

模块B和模块C都消耗模块A.

The dependency looks something like this: Dependency

假设我在模块A中声明了这个BaseViewController.

open class BaseViewController: UIViewController { }

在模块B中,我有以下声明:

extension BaseViewController {
    internal convenience init() {
        self.init(nibName: String(describing: type(of: self)), bundle: .moduleA)
    }
}

现在,据我所知,此声明应该只在模块级别可见,而不能在模块外可见.

在模块C中,我有一个使用编程布局的BaseViewController子类.

class MySuperViewController: BaseViewController { }

在同一个模块C中,我有一个协调器,它初始化这个视图控制器,如下所示:

let mySuperVC = MySuperViewController()

我调用了这个协调器方法,它从我的iOS应用程序中实例化了这个mySuperVC,在那里我导入了所有的A、B和C模块.

我预计MySuperViewController()会调用UIViewController的初始化器,因为BaseViewController的便利初始化是在模块B内部声明的,而且它是内部的,然而,被调用的初始化器是来自模块B的内部初始化器,因此导致我的应用程序崩溃,因为它找不到NIB.

我试图在模块C中编写一个相同的方便初始化,但它从模块B调用了相同的内部初始化.为什么会发生这种情况?

推荐答案

Extensions人起:

扩展可以向类型添加新功能,但不能覆盖现有功能.

您的扩展无效,并且未定义将调用什么方法.init()是UIView控制器上的现有方法,因此不能在扩展中重写它.

发生这种情况的实际原因是,BaseView控制器是一种Objective-C类型.当加载模块时,这个init方法被附加到它(目前没有一个;它的超类上只有一个).当稍后的调用方将 Select 器"init"发送到BaseViewController实例时,它将在层次 struct 中向上遍历时找到此方法.在运行时,系统不知道该方法来自哪里.它只是在加载模块时附加.这是不确定的,这就是为什么在扩展中覆盖方法是未定义的行为.

Ios相关问答推荐

滚动时突出显示工具栏项目

以编程方式更改VC&39;S导航栏按钮的属性,以响应另一个VC中的按钮按下

GraphQL iOS Apollo客户端自动持久化查询导致崩溃

如何删除NavigationView中的默认透明标头?

flutter中实现自定义底部导航栏

仅更改 AttributedString 的字符串(例如 UIButton 配置 attributeTitle)

如何更改 SwiftUI 弹出视图的大小?

如何解决错误 HE0004:无法在 Visual Studio 2022 中加载框架ContentDeliveryServices

SKScene 的更新功能似乎不起作用

UIControl 子类 - 按下时显示 UIMenu

SwiftUI - ScrollView 不显示底部文本

-1103 错误域=NSURLErrorDomain 代码=-1103资源超过最大大小iOS 13

在iOS7半透明导航栏中获取正确的 colored颜色

如何在通用应用程序中同时支持 iPad 和 iPhone 视网膜图形

iPhone 未连接.连接 iPhone 后 Xcode 将继续

如何在 Objective-C 中组合两个数组?

如何删除 Swift 数组中的所有 nil 元素?

UITextView 内容插图

AVAudioRecorder 抛出错误

iTunes Connect 中的无限制 Web 访问是什么意思