2016-09-11 3 views
7

目的はSCNNodeをサブクラス化することです。 class docsによれば、init(geometry geometry: SCNGeometry?)は指定された初期化子です(convenienceキーワードはリストされていません)。このコードは、スーパークラスの指定された初期化子を呼び出すのではありませんか?Swift:コードがそうであっても "スーパークラスの指定された初期化子を呼び出さなければなりません"エラー

Xcodeに次のエラーが表示されるのはなぜですか?

は、スーパークラスの指定イニシャライザを呼び出す必要がありますあなたも

TRY)(self.initを呼び出す前に、あなたのPreviewNodeのプロパティにアクセスしようとしていることがある問題

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

をSCNNode

Xcodeの8 GM•スウィフト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 Dabusにはクレジットがあります。 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 
    } 
} 
関連する問題