Swift - 在不知道 class 名称的情况下更改另一个视图控制器中的变量?

Swift - change variable in another view controller, without knowing the class name?

假设我在 viewController1 中有一个函数,它会更改调用该函数的视图控制器中的变量(在本例中为 viewController2)

我一直在尝试的 -

正在 viewController1 中声明函数:

func changeVariable(controller: UIViewController) {
    controller.variable = "Hello"
}

从 viewController2 调用函数:

changeVariable(self)

然而,这在声明函数时给我一个错误,告诉我 UIViewController 没有名为 'variable' 的成员。

如果我再将函数更改为:

func changeVariable() {
    viewController2.variable = "Hello"
}

有效。但是,我事先不知道哪个视图控制器正在调用函数(例如,它可能是 viewController3),所以我不能在函数中明确说明。

有谁知道我该怎么做?

非常感谢。

这就是协议的用途:当您不想共享它们的确切名称时,在 class 之间定义一种通用语言。

您可以定义描述 variable 字符串的 CommonVariable 协议:

protocol CommonVariable: class {
    var variable: String { get set }
}

然后编辑您的 ViewController2 定义以符合此协议:

class ViewController2: UIViewController, CommonVariable {
    var variable = ""
}

并编辑您的 ViewController1 方法以接受 CommonVariable 作为参数:

class ViewController1: UIViewController {
    func changeVariable(controller: CommonVariable) {
        controller.variable = "Hello"
    }
}

现在这个方法对 controller 一无所知,除了它是一个 class 和一个名为 variable.

的字符串

因此,您将能够在不知道 class 名称的情况下从 ViewController2 调用方法:

func someFunc() {
    viewController1.changeVariable(controller: self)
}

附带说明一下,CommonVariablevariableViewController1ViewController2 都是坏名字。不确定您是否真的在使用这些名称,但您应该以更具描述性的名称为目标。