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

“在super.init初始化自身之前在方法调用中使用self”,无法通过方法调用来初始化属性

赵嘉纳
2023-03-14
问题内容

我很好奇,无论如何在init方法内部调用一个用于设置类实例属性的方法。本质上,我只是有一个类来对UIView进行子类化,并在init中添加了一些子视图,而其中一些子视图是该类的实例变量。

class MyView: UIView {
    var collectionView: UICollectionView

    convenience init () {
        self.init(frame:CGRectZero)
    }

    override init (frame : CGRect) {
        super.init(frame : frame)

        addSubviews()
    }

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)

        addSubviews()
    }

    func addSubviews (){
        self.collectionView = UICollectionView()

    }
}

现在出现了问题,我无法在初始化类的内部属性之前调用super
init(在super.init调用时未初始化属性’self.collectionView’),但是在调用之前,我也无法调用自定义方法来初始化这些变量super.init,因为它不能在初始化之前使用self。我意识到我可以将实例变量设置为可选,但是看起来不太优雅,因为我知道它将始终被初始化(还有更多实例,这只是简化版本)。有没有什么方法可以使我的所有实例变量都为可选变量呢?

编辑:

我认为最终我的问题是,为什么在调用super.init之前迅速禁止调用方法?之间有什么区别:

override init (frame : CGRect) {
    addSubviews()
    super.init(frame : frame)
}

final func addSubviews (){
    self.collectionView = UICollectionView()
}

override init (frame : CGRect) {
    self.collectionView = UICollectionView()
    super.init(frame : frame)
}

问题答案:

表格文件

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

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

您需要在调用super.init()之前为实例变量设置值,并且在执行此操作之后,您将可以访问调用实例方法。在您的情况下,您可以执行以下操作:

override init (frame : CGRect) {
    self.collectionView = UICollectionView()
    super.init(frame : frame)
    // Now you can call method
    self.someMethod()
}

添加问题的编辑:

super.init()出于安全原因,您不能在调用前调用方法。如果您要这样做,则您的方法可以使用一些尚未在父类中初始化的属性



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

  • 问题内容: 我试图从一个简单的ArrayList的内容填充ListView。这是我的 Controller.java文件: 这是我的Style.fxml文件: 该程序运行,但是我输入的歌曲没有出现在ListView中(并且Song类确实具有toString方法)。 我能做什么? 问题答案: 问题是没有将控制器的初始化为预期问题的质询者。 Java 8中FXMLLoader的操作有点奇怪。 如果您在

  • 问题内容: 我正处于“操作方法”阶段,想知道服务器启动时是否有一种方法可以调用。 这将类似于Web应用程序,当我将托管bean与一起使用时:启动容器时,将对带注释的类进行实例化,并且可以从其构造函数中调用所需的任何东西。 有什么帮助吗? 问题答案: 因此,如果您用于服务请求,则可以创建,如果已经部署了应用程序,则在部署或服务器启动时将调用方法。 为此,创建将实现的类: 然后在您的中定义该监听器:

  • 初始化方法定义了对Keras层设置初始化权重的方法 不同的层可能使用不同的关键字来传递初始化方法,一般来说指定初始化方法的关键字是kernel_initializer 和 bias_initializer,例如: model.add(Dense(64, kernel_initializer='random_uniform', bias

  • 初始化方法定义了对Keras层设置初始化权重的方法 不同的层可能使用不同的关键字来传递初始化方法,一般来说指定初始化方法的关键字是init,例如: model.add(Dense(64, init='uniform')) 预定义初始化方法 uniform lecun_uniform: 即有输入节点数之平方根放缩后的均匀分布初始化(LeCun 98). normal identity:仅用于权值矩

  • 我是jmeter的新手,我遇到了以下错误: 杰米。util。BeanShellInterpreter:调用bsh方法时出错:eval无法初始化类stpl。自由党。茶。TEALib 我已经在jmeter的lib/ext中添加了java类的jar文件。我正在尝试在beanshell预处理器中导入java类。包名为且类名为TEALib,因此使用以下语法: 此外,我还在java类中添加了一个dll文件,该