为什么我不能在我的 Swift 项目中访问我的视图控制器的委托 属性?

Why can't I access the delegate property of my view controller in my Swift project?

我有一个名为 ServiceDetailController 的视图控制器,其委托 属性 如下所示:

weak var delegate: ServiceDetailControllerDelegate?

我正在尝试使用导航堆栈中的下一个视图控制器中的委托实例初始化它:

for controller in navigationController!.viewControllers as Array {
    if controller.isKind(of: ServiceDetailController.self) {
        controller.delegate = self
    }
}

但是 Xcode 给我一个错误

Value of type 'UIViewController" has no member 'delegate'.

感谢收到的任何帮助。

您的代码在运行 if 语句之后的代码之前确认控制器的类型为 ServiceDetailController,但在 if 语句中,变量 controller 的类型仍然为 ViewController. (实际上,由于您将 navigationController!.viewControllers 转换为 Arraycontroller 可能是 Any 类型。我会从您的 for 循环中删除 as Array 位。弊大于利。)

您需要将变量转换为正确的类型才能访问特定子类的属性。按如下方式更改您的代码:

    for controller in navigationController!.viewControllers {
        if let sdc = controller as? ServiceDetailController {
            sdc.delegate = self
        }
    }

if let 语法称为“可选绑定”,并在 if 语句的大括号内创建一个新变量,如果 if let 成功则该变量有效。在我们的例子中,我们使用 as? 来尝试将视图控制器转换为类型 ServiceDetailController。如果转换成功,则执行大括号内的代码,并可以访问类型为 ServiceDetailController.

的变量 sdc