2016-09-11 2 views
7

Целью является подкласс SCNNode. Согласно class docs, init(geometry geometry: SCNGeometry?) является назначенным инициализатором (нет ключевого слова convenience), так же как этот код не вызывает назначенный инициализатор своего суперкласса?Swift: «Должен вызывать назначенный инициализатор суперкласса», даже если код делает это

Почему Xcode показывает следующую ошибку?

Должен назвать назначенный инициализатору суперкласс SCNNode

class PreviewNode: SCNNode { 
    // Constants 
    let PreviewNodeColor = gRedColor 
    let Size = CGFloat(1.0) 
    let ChamferRadius = CGFloat(0.0) 

    override init() { 
     let previewBox = SCNBox(width: Size, height: Size, length: Size, chamferRadius: ChamferRadius) 
     previewBox.firstMaterial!.diffuse.contents = PreviewNodeColor 
     previewBox.firstMaterial!.transparency = 0.2 
     previewBox.firstMaterial!.specular.contents = UIColor.whiteColor() 
     super.init(geometry: previewBox) 
    } 
} 
+0

@LeoDabus привет, вы могли бы разместить сообщение в качестве ответа, а также объяснить, почему возникает ошибка, даже если он вызывает назначенный инициализатор? благодаря! – Crashalot

+0

@LeoDabus должен добавить, что мы пробовали ваш подход раньше, и он работает, но вы хотите понять, почему возникает ошибка. – Crashalot

+0

Почему голос? – Crashalot

ответ

7

Проблемы есть в том, что вы также пытаетесь получить доступ к свойству PreviewNode перед вызовом self.init()

Try например:

Xcode 8 GM • Swift 3

class PreviewNode: SCNNode { 
    let previewNodeColor: UIColor = .red 
    let size: CGFloat = 1 
    let chamferRadius: CGFloat = 0 
    convenience override init() { 
     self.init() 
     let previewBox = SCNBox(width: size, height: size, length: size, chamferRadius: chamferRadius) 
     previewBox.firstMaterial?.diffuse.contents = previewNodeColor 
     previewBox.firstMaterial?.transparency = 0.2 
     previewBox.firstMaterial?.specular.contents = UIColor.white 
     self.geometry = previewBox 
    } 
} 
+0

О, спасибо! :) – Crashalot

+0

ОК, так что это ошибочная ошибка? Зачем вам нужно ключевое слово 'удобство '? Не можете ли вы просто переопределить пустую функцию init? – Crashalot

+0

Вам нужны оба в этом случае 'удобство переопределения' –

2

Использовал этот ответ, но Лео Дабус заслуживает доверия. Прошу прокомментировать, если вы можете объяснить, равно ли верно определить новый инициализатор удобства, поскольку Leo сделал или переопределил инициализатор по умолчанию, как этот ответ, или если он предпочтительнее другого.

class PreviewNode: SCNNode { 
    // Constants 
    let MainColor = gRedColor 
    let MainSize = CGFloat(1.0) 
    let MainRadius = CGFloat(0.0) 
    let MainTransparency = CGFloat(0.2) 


    override init() { 
     super.init() 
     doInit() 
    } 


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


    private func doInit() { 
     let previewBox = SCNBox(width: MainSize, height: MainSize, length: MainSize, chamferRadius: MainRadius) 
     previewBox.firstMaterial!.diffuse.contents = MainColor 
     previewBox.firstMaterial!.transparency = MainTransparency 
     previewBox.firstMaterial!.specular.contents = UIColor.whiteColor() 
     self.geometry = previewBox 
    } 
} 
Смежные вопросы