Как инициализировать переменные с помощью self.frame в init (размер :) - PullRequest
0 голосов
/ 10 марта 2020

Мой class требует init(size:) constructor для initialization и должен позвонить super.init(size:size) после моего variables. Это проблематично c, так как я хочу инициализировать variables с size. Если я попробую это:

override init(size: CGSize) {
    tileWidth = self.frame.width/8
    tileHeight = tileWidth/2
    super.init(size: size)
 }

... тогда я получу error высказывание

'self', используемое в доступе к свойству 'frame' перед 'super.init' позвоните

и если я сделаю это:

override init(size: CGSize) {
    super.init(size: size)
    tileWidth = self.frame.width/8 //140
    tileHeight = tileWidth/2
}

... я получаю сообщение об ошибке, говорящее

Свойство self.tileHeight не инициализировано при вызове super.init

Итак, как мне это сделать?

EDIT В этом контексте код выглядит следующим образом:

class TileBoard: SKScene {

    let tileWidth:CGFloat
    let tileHeight:CGFloat


    override init(size: CGSize) {
        super.init(size: size)
        tileWidth = self.frame.width/8
        tileHeight = tileWidth/2
    }

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

Ответы [ 2 ]

0 голосов
/ 10 марта 2020

Я исправил это, используя factory based dependency injection вот так:

protocol DependencyInjectionProtocol {
    func injection() -> CGFloat
}

class InjectWidth: UIViewController, DependencyInjectionProtocol {
    func injection() -> CGFloat {
        return self.view.frame.width/8.0
    }
}

class InjectHeight: UIViewController, DependencyInjectionProtocol {
    func injection() -> CGFloat {
        let height = (self.view.frame.width/8.0) / 2
        return height
    }
}

class InjectionClient {
    let delegate: DependencyInjectionProtocol

    init(delegate: DependencyInjectionProtocol) {
        self.delegate = delegate
    }
}

class TileBoard: SKScene {

    let tileWidth:CGFloat = InjectionClient(delegate: InjectWidth()).delegate.injection()
    let tileHeight:CGFloat = InjectionClient(delegate: InjectHeight()).delegate.injection()

...

0 голосов
/ 10 марта 2020

Рассмотрим

class TopView:UIView {

    var tileWidth:CGFloat?
    var tileHeight:CGFloat?

    init(size: CGSize) {
        super.init(frame: CGRect.init(x: 0, y: 0, width: size.width, height: size.height))
     }

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

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



class BottomView:TopView {

     override init(size: CGSize) {
        super.init(size: size)
        tileWidth = frame.width / 8.0
        tileHeight = tileWidth / 2.0
     }
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    } 
}
...