Могу ли я выполнить инициализацию в SKSpriteNode без сбоя приложения?

#swift #skspritenode

Вопрос:

Я просматриваю приведенный ниже код из цикла for. Если определенные обстоятельства верны, я бы хотел «не» создавать SKSpriteNode. Есть ли конкретное значение возврата, т. Е. -1, которое я могу вызвать, что приведет к тому, что SKSpriteNode не будет создан без сбоя приложения?

Или это то, что мне нужно выяснить, прежде чем создавать его?

 class GuessSlot : SKSpriteNode{
    var nodeIndex : Int
    var holdingGem : Bool = false

    init(color: SKColor, size: CGSize, width: CGFloat, iFactor: Int, guessBarRef: GuessBar){
        let skTexture = SKTexture(imageNamed: "gem_slot")
        self.nodeIndex = iFactor
        super.init(texture: skTexture, color: color, size: size)
        self.name = "slot"
        self.size.width     = size.width
        self.size.height    = size.width
        self.anchorPoint    = CGPoint(x: 0.5, y: 0.5)
        var indexSpacing    = (size.width * CGFloat(iFactor))  
            ((size.height * 2) * CGFloat(iFactor))   (size.width/2)
            indexSpacing  = 10

        self.position = CGPoint(x: indexSpacing, y: guessBarRef.size.height/2)

        self.isHidden = false
        guessBarRef.addChild(self)
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
 }
 

Ответ №1:

Похоже, вам может понадобиться отказоустойчивый инициализатор. Это вернулось nil бы (что-то вроде «ничего» -1 ).

 init?(color: SKColor, size: CGSize, width: CGFloat, iFactor: Int, guessBarRef: GuessBar) {
    if /* your condition here */ {
        return nil
    }
}
 

Затем вы бы использовали его вот так:

 if let slot = GuessSlot(color: ..., size: ..., width: ..., iFactor: ..., guessBarRef: ...) {
    /// `SKSpriteNode` has been created
} else {
    /// won't crash app and `SKSpriteNode` is not created
}