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

凯文·迪特里亚

我很好奇是否可以在设置类实例属性的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)
}
阿列克谢·皮丘科夫(Alexey Pichukov)

表格文件:

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

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

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

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

添加问题的编辑:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Swift:在super.init初始化自我编译错误之前的方法调用中使用'self'

来自分类Dev

super.init调用未初始化属性“ self。*”

来自分类Dev

迅速在super.init调用中未初始化属性“ self.title”

来自分类Dev

迅速在super.init调用中未初始化属性“ self.title”

来自分类Dev

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

来自分类Dev

属性未在super.init调用中初始化

来自分类Dev

从NSObject继承对象导致错误在super.init调用中未初始化属性'self._username'

来自分类Dev

在super.init之前的表达式中使用初始化属性的Swift错误

来自分类Dev

在“super.init”调用之前在方法调用“foo”中使用“self”

来自分类Dev

Swift 2.0:在存储属性初始化之前使用self in方法调用

来自分类Dev

属性'self.myDelegate'未在super.init中初始化-委托

来自分类Dev

Swift:便捷初始化程序-在self.init调用之前使用的Self

来自分类Dev

更新到Xcode 6.1后,“在super.init初始化之前在基础对象中使用属性'nibName'”

来自分类Dev

更新到Xcode 6.1后,“在super.init初始化之前在基础对象中使用属性'nibName'”

来自分类Dev

Swift:属性未在super.init调用中初始化

来自分类Dev

指定的初始化程序仅应在“ super”上调用指定的初始化程序

来自分类Dev

迅速。在初始化所有存储的属性之前在方法调用中使用“自我”

来自分类Dev

我无法快速在super.init()之前或之后初始化事物

来自分类Dev

在Swift中NSObject子类的初始化程序中调用super.init()

来自分类Dev

通过调用方法初始化数组

来自分类Dev

在init()中初始化2个变量:'self'在初始化所有存储的属性之前使用

来自分类Dev

super()方法仅初始化一些参数

来自分类Dev

Junit是否通过每次测试方法调用来重新初始化类?

来自分类Dev

SwiftUI“无法在属性初始化程序中使用实例成员'numberOfDevice';属性初始化程序在'self'可用之前运行”错误

来自分类Dev

Swift类中的自定义init给出“属性未在隐式生成的super.init调用中初始化”错误?

来自分类Dev

在迅速调用超级指定的初始化方法之前初始化属性值的目的是什么?

来自分类Dev

未捕获的错误:无法在初始化之前调用按钮上的方法;试图调用方法“加载”

来自分类Dev

错误:无法在初始化之前调用选项卡上的方法;试图调用方法“选项”

来自分类Dev

如何通过调用此方法初始化此数组?

Related 相关文章

  1. 1

    Swift:在super.init初始化自我编译错误之前的方法调用中使用'self'

  2. 2

    super.init调用未初始化属性“ self。*”

  3. 3

    迅速在super.init调用中未初始化属性“ self.title”

  4. 4

    迅速在super.init调用中未初始化属性“ self.title”

  5. 5

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

  6. 6

    属性未在super.init调用中初始化

  7. 7

    从NSObject继承对象导致错误在super.init调用中未初始化属性'self._username'

  8. 8

    在super.init之前的表达式中使用初始化属性的Swift错误

  9. 9

    在“super.init”调用之前在方法调用“foo”中使用“self”

  10. 10

    Swift 2.0:在存储属性初始化之前使用self in方法调用

  11. 11

    属性'self.myDelegate'未在super.init中初始化-委托

  12. 12

    Swift:便捷初始化程序-在self.init调用之前使用的Self

  13. 13

    更新到Xcode 6.1后,“在super.init初始化之前在基础对象中使用属性'nibName'”

  14. 14

    更新到Xcode 6.1后,“在super.init初始化之前在基础对象中使用属性'nibName'”

  15. 15

    Swift:属性未在super.init调用中初始化

  16. 16

    指定的初始化程序仅应在“ super”上调用指定的初始化程序

  17. 17

    迅速。在初始化所有存储的属性之前在方法调用中使用“自我”

  18. 18

    我无法快速在super.init()之前或之后初始化事物

  19. 19

    在Swift中NSObject子类的初始化程序中调用super.init()

  20. 20

    通过调用方法初始化数组

  21. 21

    在init()中初始化2个变量:'self'在初始化所有存储的属性之前使用

  22. 22

    super()方法仅初始化一些参数

  23. 23

    Junit是否通过每次测试方法调用来重新初始化类?

  24. 24

    SwiftUI“无法在属性初始化程序中使用实例成员'numberOfDevice';属性初始化程序在'self'可用之前运行”错误

  25. 25

    Swift类中的自定义init给出“属性未在隐式生成的super.init调用中初始化”错误?

  26. 26

    在迅速调用超级指定的初始化方法之前初始化属性值的目的是什么?

  27. 27

    未捕获的错误:无法在初始化之前调用按钮上的方法;试图调用方法“加载”

  28. 28

    错误:无法在初始化之前调用选项卡上的方法;试图调用方法“选项”

  29. 29

    如何通过调用此方法初始化此数组?

热门标签

归档