您永远不会在class2 中创建class1 的实例来访问变量。
我猜你正在使用 Storyboards。在这种情况下,您不想创建class1 的实例。相反,您将使用委托(如果您不使用 Storyboard,这也是一个好主意)。
委派可能是一个复杂的话题,所以我会尽量保持简单。
首先,您从协议开始。通常你把它命名为<CLASS-NAME>DataSource,所以你会这样做:
protocol class2DataSource: class {}
委派协议需要class 关键字。
然后,当您调用协议委托的类中的方法时,您可以将希望在其他类中调用的方法添加到其中,例如,willCoolFunc:
protocol class2DataSource: class {
func willCoolFunc(with variable: Int)
}
您拥有该参数,因此您可以尝试访问变量cool_variable。
接下来,您需要在class2 中创建一个class2DataSource 类型的变量:
weak var dataSource: class2DataSource?
确保变量是weak 并且是可选的。
接下来,调用方法,你会在coolFunc:
func coolFunc () {
dataSource?.willCoolFunc(with: cool_variable)
}
现在你,要在调用函数时访问cool_variable,你需要在class1上实现class2DataSource。创建实现class2DataSource的class1的扩展并添加函数willCoolFunc:
extension class1: class2DataSource {
func willCoolFunc(with variable: Int) {
}
}
现在您可以在class1 中访问变量cool_variable!原因是因为当你调用class2.coolFunc()时,willCoolFunc方法被传入cool_variable。任何实现class2DataSource的类都可以通过willCoolFunc方法访问cool_variable。
为了完成该方法,扩展程序如下所示:
extension class1: class2DataSource {
func willCoolFunc(with variable: Int) {
self.label1.text = "\(variable)"
}
}
我们差不多完成了,但还没有完成。我们仍然需要将class1 设置为class2DataSource 的数据源。为此,我将从this post 引用 Nikolay Mamaev:
转到界面生成器。
在对象库的搜索文本字段中键入“对象”,然后将“对象”拖到包含连接到的视图控制器中
class1(即,与添加任何视图或视图控制器相同)
故事板场景,除了您添加的不是视图或视图
控制器而是一个抽象对象)。
在故事板左侧的“场景”面板中,突出显示刚刚添加的对象;在右侧面板中转到“身份检查器”和
键入 class2DataSource 而不是预定义的 NSObject。在左侧
panel ('Scenes'), 'Object' 将被重命名为 'Class2 Data Source'
自动。
在情节提要左侧的“场景”面板中,从 UIView [*不是控制器*] 控制并拖动到“Class2 数据源”;
在弹出窗口中,选择dataSource outlet。
那里!现在,当您调用class2.coolFunc() 时,您将class1 的label1 的文本设置为cool_variable 的值!