大家好!
编写了为我生成播放器的代码:
class PlayerPlane: SKSpriteNode {
static func populatePlayerPlane() -> SKSpriteNode {
let playerPlane = SKSpriteNode(imageNamed: "airplane_1_14")
playerPlane.position = CGPoint(x: 200, y: 200)
playerPlane.zPosition = 50
return playerPlane
}
func fireEnemies() {
print("Attack")
}
}
由于它是使用 SKSpriteNode
生成的,因此我无法附加方法 fireEnemies。现在我无法将其从 SKSpriteNode
转换为 PlayerPlane
。
当然,我可以使用PlayerPlane
初始化程序以其他方式进行所有操作,但可能我错过了一些东西,并且还有其他更智能的解决方案可以将方法fireEmenies附加到PlayerPlane的实例?
最佳答案
如果您需要 PlayerPlane
作为类,那么您可以这样做(因为 PlayerPlane
是 SKSpriteNode
的子类,您可以使用它是初始化器):
class PlayerPlane: SKSpriteNode {
static func populatePlayerPlane() -> PlayerPlane {
let playerPlane = PlayerPlane(imageNamed: "airplane_1_14")
playerPlane.position = CGPoint(x: 200, y: 200)
playerPlane.zPosition = 50
return playerPlane
}
func fireEnemies() {
print("Attack")
}
}
但是您也可以使用协议(protocol)并为 SKSpriteNode
编写扩展,如果您想让其他对象/结构采用 PlayerPlane
功能,这会很方便:
protocol PlayerPlane {
func fireEnemies()
}
extension SKSpriteNode : PlayerPlane {
func fireEnemies() {
print("Attack")
}
}
extension SKSpriteNode {
static func populatePlayerPlane() -> SKSpriteNode {
let playerPlane = SKSpriteNode(imageNamed: "airplane_1_14")
playerPlane.position = CGPoint(x: 200, y: 200)
playerPlane.zPosition = 50
return playerPlane
}
}
最后,当您想要“其他”方式将 fireEnemies
功能附加到 PlayerPlane
时,您还可以为协议(protocol)编写扩展:
class PlayerPlane: SKSpriteNode {
static func populatePlayerPlane() -> PlayerPlane {
let playerPlane = PlayerPlane(imageNamed: "airplane_1_14")
playerPlane.position = CGPoint(x: 200, y: 200)
playerPlane.zPosition = 50
return playerPlane
}
}
protocol FireEnemies {
func fireEnemies()
}
extension PlayerPlane : FireEnemies {
func fireEnemies() {
print("Attack")
}
}
关于swift - 如何将实例方法连接到我的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43490282/