我正在测试从初始化器运行委托模式.这是我的数据供应商测试类及其"数据源":

protocol MyClassDataSource : AnyObject{
    func returnString(string: String)
}

protocol MyClassProtocol: AnyObject {
    var dataSource : MyClassDataSource? { get set }
}

class MyClass : MyClassProtocol {
    weak var dataSource: MyClassDataSource?
    
    init() {
        print("1. 我的班级已初始化")
        getString()
    }

    func getString() {
        let myString = "Hello World"
        print("3. The getString func run")
        dataSource?.returnString(string: myString)
    }
}

我将数据发送到我的另一个班级.这是:

class OtherClass : MyClassDataSource {
    
    weak var myClass : MyClassProtocol?
    
    init(myClass: MyClassProtocol?) {
        self.myClass = myClass
        self.myClass?.dataSource = self
        print("2. MyClass委托集")
    }
    
    func returnString(string: String) {
        print("4. Delegate run and print the string: \(string)")
    }
}

然后我初始化它们:

let myClass = MyClass()
let otherClass = OtherClass(myClass: myClass)

我想创建我的类并将数据从MyClass发送到DeliverClass.我想使用int()函数将dataSource设置为self,并运行一个函数并发送数据.当然,它没有起作用.我希望在控制台中看到的内容:

  1. 我的班级已初始化
  2. MyClass委托集
  3. get字符串()func运行
  4. 数据源在Inbox Class中运行并打印字符串:Hello World

但在设置或创建Inbox Class之前,getString()立即运行并打印以下内容:

  1. 我的班级已初始化
  2. get字符串()func运行
  3. MyClass委托集

如果我手动延迟get字符串()运行,它就会起作用:

    func getString() {
        let myString = "Hello World"
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { [weak self] in
            print("3. The getString func run")
            self?.dataSource?.returnString(string: myString)
        }
    }

所以,我的问题是,我如何才能让它发挥作用?我可以仅通过初始化类来设置委托并在之间发送数据吗?有可能以某种方式做到吗?

推荐答案

init中拨打getString是不可能的.您希望在调用getString之前设置数据源,但init中调用了getString,因此其他代码没有机会设置数据源.其他代码只能设置init之后的数据源.

为了实现此事件序列,您可以在设置dataSource后立即呼叫getString.这是您可以有意义地呼叫getString的最早时刻-在此之前任何时候都不会呼叫returnString.

weak var dataSource: MyClassDataSource? {
    didSet { 
        print("2. MyClass delegate set")
        getString() 
    }
}

Swift相关问答推荐

是否在字符串属性上搜索数组和子数组?

如何增加 NSStatusBar 图像大小?

允许视图在视图内更改

Xcode创建GitHub仓库,但未推送所有文件

如何隐藏集合视图中特定的单元格,以避免出现空白空间?

PassthroughSubject 的 AsyncPublisher 值属性未生成所有值

为什么 SwiftUI 中 ForEach 的这个 Select 不起作用?

如何制作进度加载动画?

在 SwiftUI 中将属性显式设置为其默认值

用逻辑运算符保护让

展开 List 中的 HStack 以端到端但不是从上到下,因此看起来项目之间有更宽的空间

Vapor - 流利的,将对象保存到 PostgreSQL

临时添加到视图层次 struct 后,Weak view引用不会被释放

无法从自定义动态框架(Swift)访问类

使用 swift 运行 pod install 时出错

修复 Swift 3 中的警告C-style for Statement is deprecated

<<错误类型>> 奇怪的错误

Void 函数中意外的非 Void 返回值 (Swift 2.0)

在 xcode8 中找不到 ModuleName-Swift.h 文件

swift中相同的数据类型多变量声明