2016-09-11 11 views
7

yapılıyor olsa bile "Üst sınıfın atanmış başlatıcısı aranıyor" hatası. Amaç, SCNNode alt sınıfını bulmaktır. class docs'a göre, init(geometry geometry: SCNGeometry?) atanmış bir başlatıcıdır (listelenen convenience anahtar kelime yok), bu kod, süper sınıfının atanmış başlatıcısını çağırmıyor mu?Swift: Kod,

Xcode neden aşağıdaki hatayı gösteriyor?

üst sınıf SCNNode bir tayin başlatıcı demek zorunda

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, bir yanıt olarak yayınlayabilir ve ayrıca, belirtilen başlatıcıyı çağırıyor gibi görünse de, hatanın neden oluştuğunu açıklayabilir misiniz? Teşekkürler! – Crashalot

+0

@LeoDabus, yaklaşımınızı daha önce denediğimizi eklemiş olmalıydı ve işe yaramaz ancak hatanın neden oluştuğunu anlamak ister. – Crashalot

+0

Neden aşağı oy? – Crashalot

cevap

7

sorun da()

deneyin self.init çağırmadan önce PreviewNode özelliklerine erişmeye çalışıyor olması var şunun gibi:

Xcode 8 GM • Hızlı 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

Oh ve teşekkürler! :) – Crashalot

+0

Tamam, bu yanıltıcı bir hatadır? Neden 'kolaylık' anahtar kelimesine ihtiyacınız var? Boş init işlevini geçersiz kılmıyor musunuz? – Crashalot

+0

Bu durumda, 'kolaylık geçersiz kılma' –

2

Bu yanıtı kullandınız, ancak Leo Dabus krediyi hak ediyor. Leo'nun yaptığı gibi yeni bir kolay başlatıcı tanımlamak için eşit olarak geçerli olup olmadığını veya bu yanıtın yaptığı gibi varsayılan başlatıcıyı geçersiz kılmayı veya diğerine tercih edilirse, lütfen yorum yapın.

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 
    } 
}