当前位置: 首页 > 面试题库 >

Swift类中的错误:super.init调用时未初始化属性-如何初始化需要在其初始值设定项参数中使用self的属性

韩经武
2023-03-14
问题内容

UITableViewController快速覆盖了其中的两个必需变量,这些变量通过使用weak引用进行初始化,self因为这些变量用于实现UITableViewDataSource协议,并且需要self引用以使用其tableView属性

class VideosListViewController: UITableViewController {

  required init(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    self.datasourceOfflineVideos = ASDataSource(tableViewController: self)
    self.datasourceOnlineVideos = ASDataSource(tableViewController: self)
  }

  // MARK: - Variables
  var datasourceOnlineVideos:ASDataSource
  var datasourceOfflineVideos:ASDataSource
  }

现在的问题是,它给了我Property not initialized at super.initcall预期的错误

Swift的编译器执行四项有用的安全检查,以确保两阶段初始化完成且没有错误

安全检查1指定的初始化程序在将其委托给超类初始化程序之前,必须确保初始化其类引入的所有属性。

摘录自:苹果公司“ The Swift Programming
Language”。iBooks。https://itunes.apple.com/cn/book/swift-programming-
language/id881256329?mt=11

所以我的问题是:

如果swift类中的实例变量需要selfASDataSource这里的类型变量一样初始化引用,我该怎么做?

由于swift不允许我super.init()在初始化所有实例变量之前调用,并且也不允许我在调用之前self在初始化器中使用init()``super.init()

目前,我正在使用可选变量来解决此问题。但是出于学习目的,我想知道如何去做。提前致谢 :)


问题答案:

您只需要在初始值设定项中反转super.init / properties的顺序:

 required init(coder aDecoder: NSCoder) {
    self.datasourceOfflineVideos = ASDataSource(tableViewController: self)
    self.datasourceOnlineVideos = ASDataSource(tableViewController: self)
    super.init(coder: aDecoder)
  }

首先出现实例属性,然后才能调用超类初始化程序。但这在您的情况下是不可能的,因为您正在引用self

在这种情况下,解决方法是使属性隐式展开为可选:

var datasourceOnlineVideos:ASDataSource!
var datasourceOfflineVideos:ASDataSource!

由于不需要初始化可选参数,因此可以super.init在调用方法后安全地对其进行初始化。被隐式展开时,可以将它们用作其他任何非可选属性。

Apple在多个类中使用了这种模式,包括UIViewController:当您从IB添加插座时,组件属性始终被声明为隐式展开。这是因为控件本身不是在初始化程序中实例化的,而是在以后的阶段中实例化的。



 类似资料:
  • 问题内容: 我刚刚将xcode更新为6.3.1。问题是自Swift 1.2起我收到了这个奇怪的错误消息。我收到这种错误消息 在此代码上 问题答案: 在调用任何init方法之前,必须初始化所有属性 因此,在调用super.init()之前先进行更改 例外: 可选属性 具有默认值的属性 懒惰的财产

  • 问题内容: 我有两节课,和 通过上面的实现,我得到了错误: 为什么在致电之前必须先设置? 问题答案: 引用Swift编程语言,它回答了您的问题: “ Swift的编译器执行四项有用的安全检查,以确保两阶段初始化完成且没有错误:” 安全检查1“指定的初始值设定项必须确保由其类引入的所有属性在将其委托给超类初始值设定项之前都已初始化。” 摘录自:苹果公司“ The Swift Programming

  • 问题内容: 您将如何在Swift中实现以下模式? 所述类被初始化,其中包含的词典JSON数组。这些字典用于初始化类。但是,当访问或属性时,对象的初始化会延迟进行。 问题答案: 看来这个问题已经得到了很大的回答,但是回过头来看原始帖子,这是(IMHO)Swift中相对简洁的翻译。关键是您可以链接惰性属性。请注意,我同时使用了类函数和闭包- 两者都很好。

  • 问题内容: 我有一个Swift类,我想看起来像这样: 但是,Swift不喜欢我要传递给初始化程序的事实。我在这里打破某些模式吗?应该如何完成这样的初始化? 问题答案: 您已经找到了Implicitly Unwrapped Optional 的主要用例。 你需要访问的,之前被初始化。 否则,应该 永远 是零,所以你不应该有外部的检查。 因此,您应该声明。

  • 问题内容: 我很好奇,无论如何在init方法内部调用一个用于设置类实例属性的方法。本质上,我只是有一个类来对UIView进行子类化,并在init中添加了一些子视图,而其中一些子视图是该类的实例变量。 现在出现了问题,我无法在初始化类的内部属性之前调用super init(在super.init调用时未初始化属性’self.collectionView’),但是在调用之前,我也无法调用自定义方法来初

  • 但是我得到错误“在初始化之前使用属性”这是有道理的,因为我只声明。但是我不知道我应该如何或为了什么初始化输入,因为值是输入