2016-09-11 16 views
7

Mục đích là để phân lớp SCNNode. Theo số class docs, init(geometry geometry: SCNGeometry?) là trình khởi tạo được chỉ định (không có từ khóa nào được liệt kê là convenience), vì vậy mã này không gọi trình khởi tạo được chỉ định của siêu lớp của nó?Swift: "Phải gọi một initializer được chỉ định của superclass" lỗi mặc dù mã đang làm như vậy

Tại sao Xcode hiển thị lỗi sau?

Phải gọi một initializer được chỉ định của SCNNode lớp cha

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 hi bạn có thể đăng câu trả lời và giải thích tại sao lỗi xảy ra mặc dù nó có vẻ đang gọi một trình khởi tạo được chỉ định không? cảm ơn! – Crashalot

+0

@LeoDabus nên có thêm rằng chúng tôi đã thử cách tiếp cận của bạn trước đây, và nó hoạt động nhưng muốn hiểu tại sao lỗi xảy ra. – Crashalot

+0

Tại sao bỏ phiếu xuống? – Crashalot

Trả lời

7

Vấn đề đó là bạn cũng đang cố gắng truy cập vào các thuộc tính PreviewNode của bạn trước khi gọi self.init()

Thử như thế này:

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

Oh và cảm ơn! :) – Crashalot

+0

OK vì vậy đó là lỗi gây hiểu lầm? Tại sao bạn cần từ khoá 'tiện lợi'? Bạn có thể không chỉ ghi đè lên chức năng init rỗng? – Crashalot

+0

Bạn cần cả hai trong trường hợp này 'ghi đè thuận tiện' –

2

Sử dụng câu trả lời này, nhưng Leo Dabus xứng đáng nhận được tín dụng. Hãy bình luận nếu bạn có thể giải thích liệu nó có hợp lệ không khi xác định một bộ khởi tạo tiện lợi mới như Leo đã làm hoặc ghi đè bộ khởi tạo mặc định như câu trả lời này, hoặc nếu cái nào thích hợp hơn với cái kia.

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 
    } 
} 
Các vấn đề liên quan