2014-06-06 19 views
6

Tôi rất mới phát triển iOS, nhưng tôi đã chơi xung quanh với ứng dụng mẫu SpriteKit để tìm hiểu cách mọi thứ hoạt động và cố gắng khởi động Swift khi tôi đang ở đó. Một điều tôi đang gặp phải là làm thế nào để làm việc với các lớp con SpriteKit.Phân lớp lớp SpriteKit trong Swift

tôi trong file GameScene.swift và tôi đang cố gắng để trích xuất một lớp học cho các "Hello World" nhãn, vì vậy đây là những tập tin giống như:

// GameScene.swift 

import SpriteKit 

class HelloLabel: SKLabelNode { 
    init(fontNamed: String) { 
     super.init(fontNamed: fontNamed) 
     self.text = "Hello, World!" 
     self.fontSize = 65; 
     self.position = CGPoint(x: 400, y: 500); 
    } 
} 

class GameScene: SKScene { 
    override func didMoveToView(view: SKView) { 
     /* Setup your scene here */ 
//  let myLabel = SKLabelNode(fontNamed:"Chalkduster") 
//  myLabel.text = "Hello, World!"; 
//  myLabel.fontSize = 65; 
//  myLabel.position = CGPoint(x: 400, y: 500); 

     let myLabel = HelloLabel(fontNamed: "Chalkduster") 
     self.addChild(myLabel) 
    } 

    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) { 
     /* snip, no changes made here */ 
    } 

    override func update(currentTime: CFTimeInterval) { 
     /* snip, no changes made here */ 
    } 
} 

Vì vậy, HelloLabel được thiết kế chỉ là một pass-through trong một nỗ lực để hiểu làm thế nào tất cả mọi thứ dây với nhau, nhưng khi tôi chạy ứng dụng, tôi nhận được lỗi sau:

/Users/jon/Projects/ErrorExample/ErrorExample/GameScene.swift: 11: 11: fatal error: use of unimplemented initializer 'init()' for class 'ErrorExample.HelloLabel' 

tôi không hiểu được điều gì thông điệp này đang cố gắng cho tôi biết . Cách tôi đọc lỗi này là nó phàn nàn rằng tôi đã không thực hiện một initializer gọi là init trong lớp ErrorExample.HelloLabel, nhưng nó chắc chắn trông giống như tôi có với tôi!

Vì vậy, tôi đang làm gì sai ở đây - làm cách nào để trích xuất một lớp để ẩn tất cả thiết lập này?

Trả lời

11

Tôi không chắc chắn chính xác lý do tại sao, nhưng các chức năng ẩn bên trong SKLabelNode đã cố gắng để gọi một hàm init không có tham số. Điều này dường như hoạt động:

class HelloLabel: SKLabelNode { 
    init() { 
     super.init() 
    } 

    init(fontNamed fontName: String!) { 
     super.init(fontNamed: fontName) 
     self.text = "Hello, World!" 
     self.fontSize = 65; 
     self.position = CGPoint(x: 400, y: 500); 
    } 
} 
+0

Awesome, cảm ơn để được giúp đỡ !! :) – jonallured

0

Có lẽ vì siêu lớp mong đợi một số NSString* thay đổi init(fontNamed: String) { thành init(fontNamed: NSString) { sẽ giải quyết vấn đề?

Hoặc một khả năng khác có thể bằng cách sử dụng các obj-c bắc cầu:

init(fontNamed: String) { 
    super.init(fontNamed: fontNamed.bridgeToObjectiveC()) 
    ... 
} 
+0

Cảm ơn Jiaaro, nhưng khi tôi thêm rằng từ khóa, sau đó tôi nhận được lỗi này: 'đè' không hợp lệ về việc kê khai này. – jonallured

+0

oh bạn là 100% bên phải - init không yêu cầu 'override' – Jiaaro

+0

@jonallured ok có lẽ đó là một loại điều - vì kiểu đối số là một 'String' và lớp cha mong đợi một' NSString * ' – Jiaaro

-1

Trước tiên bạn phải khởi tạo lớp học và sau đó khởi tạo siêu lớp. Vì vậy, init() của bạn sẽ giống như thế này:

init(fontNamed: String) { 
     self.text = "Hello, World!" 
     self.fontSize = 65; 
     self.position = CGPoint(x: 400, y: 500); 
     super.init(fontNamed: fontNamed) 
    } 

Đó là do an toàn và được giải thích trong phiên 403 của WWDC, Intermediate Swift.

+1

Cảm ơn Cojoj, nhưng điều này không hiệu quả vì bạn sẽ gặp lỗi khi sử dụng 'text' trước khi bạn gọi là' init'. Bạn phải 'super.init' trước. – jonallured

2

Điều này dường như làm việc tốt hơn:

class LinkLabel: SKLabelNode { 

    override init() { 
     super.init() 
    } 

    override init(fontNamed fontName: String!) { 
     super.init(fontNamed: fontName) 
     self.text = "Hello, World!" 
     self.fontSize = 65; 
     self.position = CGPoint(x: 400, y: 500); 
    } 

    required init(coder aDecoder: NSCoder!) { 
     super.init() 
    } 

} 
Các vấn đề liên quan