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

Swift类中的错误:super.init调用未初始化属性

匡安宜
2023-03-14
问题内容

我有两节课,ShapeSquare

class Shape {
    var numberOfSides = 0
    var name: String
    init(name:String) {
        self.name = name
    }
    func simpleDescription() -> String {
        return "A shape with \(numberOfSides) sides."
    }
}

class Square: Shape {
    var sideLength: Double

    init(sideLength:Double, name:String) {
        super.init(name:name) // Error here
        self.sideLength = sideLength
        numberOfSides = 4
    }
    func area () -> Double {
        return sideLength * sideLength
    }
}

通过上面的实现,我得到了错误:

property 'self.sideLength' not initialized at super.init call
    super.init(name:name)

为什么self.sideLength在致电之前必须先设置super.init


问题答案:

引用Swift编程语言,它回答了您的问题:

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

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

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



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

  • 问题内容: 我快速覆盖了其中的两个必需变量,这些变量通过使用引用进行初始化,因为这些变量用于实现协议,并且需要引用以使用其属性 现在的问题是,它给了我预期的错误 Swift的编译器执行四项有用的安全检查,以确保两阶段初始化完成且没有错误 安全检查1指定的初始化程序在将其委托给超类初始化程序之前,必须确保初始化其类引入的所有属性。 摘录自:苹果公司“ The Swift Programming La

  • 问题内容: 这段代码适用于第一个XCode 6 Beta,但在最新的Beta中,它不起作用,并显示以下错误 : 这就是此类的初始化方式: 我坚持下去..最简单的解决方法是什么? 问题答案: 是SKSpriteNode类中唯一指定的初始值设定项,其余都是方便的初始值设定项,因此您不能在它们上调用super。将代码更改为此: 此外,我会将所有这些整合到一个初始化器中。

  • 我正试图在谷歌地图Android API v2中获得一个带有自定义图标的标记。我刚刚更改了Google提供的一个示例。我添加了到方法中的RawMapViewDemoActivity 但我总是得到一个“IBitmapDescriptorFactory未初始化”。 在BitmapDescriptorFactory中,它说: 在使用此类中的任何方法之前,您必须执行以下操作之一以确保初始化此类: > 等待

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

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