尝试快速初始化超类属性但遇到错误

Posted

技术标签:

【中文标题】尝试快速初始化超类属性但遇到错误【英文标题】:Trying to initialize super class property in swift but run into errors 【发布时间】:2016-08-17 15:16:35 【问题描述】:

我是 swift 新手,目前正在学习初始化程序。我遇到了覆盖父类初始化程序的问题。 我得到一个编译器错误“在超级初始化初始化自我之前,在属性访问‘ImageTexture’中使用‘自我’”

我希望在调用特殊徽章类时使用新图像

这是我得到错误的特殊徽章类

class SpecialBadge: Badge 

    enum BadgeAnimation: Int 
        case GrowAndShrink = 0, Rotate, Shake
    

    override init(requestType: UDRequestType) 

        let animation = BadgeAnimation(rawValue: Int(arc4random_uniform(3)))
        self.imageTexture = SKTexture(imageNamed: "BadgeTeal")
        super.init(requestType: requestType)


        switch animation! 
        case .GrowAndShrink:
            growShrink()

        case .Rotate:
            rotate()

        case .Shake:
            shake()
        
    

我在网上打电话时遇到错误:

self.imageTexture = SKTexture(imageNamed: "BadgeTeal")

在致电super.init(requestType: requestType)之前

我的父类;

class Badge: SKSpriteNode 

    var requestType: UDRequestType
    var imageTexture: SKTexture?

    init(requestType: UDRequestType) 
        self.requestType = requestType

        if let texture = imageTexture 
            super.init(texture: texture, color: UIColor.clearColor(), size: CGSizeMake(48, 48))
         else 
            let newTexture = SKTexture(imageNamed: "BadgeMagenta")
            super.init(texture: newTexture, color: UIColor.clearColor(), size: CGSizeMake(48, 48))
        
    

    required init?(coder aDecoder: NSCoder) 
        fatalError("init(coder:) has not been implemented")
    

我不知道如何初始化 imageTexture,以便它可以在调用 SpecialBadge 中的初始化程序之前使用不同的图像,非常感谢任何帮助

【问题讨论】:

if let 绑定总是会失败,因为imageTexture 没有默认值。这是故意的吗? 【参考方案1】:

这只是你做事的顺序问题。这是非法的:

self.imageTexture = SKTexture(imageNamed: "BadgeTeal")
super.init(requestType: requestType)

这是合法的:

super.init(requestType: requestType)
self.imageTexture = SKTexture(imageNamed: "BadgeTeal")

规则是您必须先完成超类的初始化,然后才能对自己的类进行任何特殊操作。

【讨论】:

嘿,我尝试过这种方法,但我的目标是使用 SKTexture(imageNamed: "BadgeTeal") 但 imageTexture 在调用初始化程序时为空,它使用 SKTexture(imageNamed: "BadgeMagenta")徽章类。有没有办法覆盖在 Badge 类初始化程序中使用的 super.init? 我没有看到问题所在。只需先调用super.init dead,然后再执行其他所有操作。

以上是关于尝试快速初始化超类属性但遇到错误的主要内容,如果未能解决你的问题,请参考以下文章

如果我使用Superclass初始化子类对象,为什么该对象具有子类的属性,但是超类的方法?

Swift - 必须调用超类 SKSpriteNode 错误的指定初始化程序

Swift:“必须调用超类的指定初始化程序”错误,即使代码正在这样做

从超类对象初始化子类实例

从初始化程序返回而不初始化所有存储的属性swift ios

在swift初始化期间使用枚举设置属性