Swift: 如何将协议类型转换为特定协议?
Swift: how to type cast a protocol into a specific one?
我有一个简单的代码如下。 class MySprite(显示红色矩形)是从 class SKSpriteNode 和协议 ISprite 扩展而来的:
import SpriteKit
protocol ISprite {
func doSomething()
}
class MySprite: SKSpriteNode, ISprite {
var scence: SKScene?
init(theParent: SKScene) {
super.init(texture: nil, color: UIColor.redColor(), size: CGSizeMake(300, 300))
self.position = CGPointMake(500, 500)
scence = theParent
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func doSomething() {
}
}
class GameScene: SKScene {
override func didMoveToView(view: SKView) {
var mySprite:SKSpriteNode = MySprite(theParent: self)
self.addChild(mySprite)
}
}
代码可以编译,运行很好。但是,如下所示将 mySprite 的类型从 SKSpriteNode 更改为 ISprite 后,我无法将其转换/向下转换回 SKSpriteNode:
var mySprite:ISprite = MySprite(theParent: self)
self.addChild(mySprite as? SKSpriteNode!)
swift 编译器说错误:"Type SKSpriteNode does not conform to protocol ISprite"
关于错误和解决方案有什么想法吗?非常感谢!
addChild 需要一个不符合 ISprite 的 SKNode。它也可以采用 SKNode 的子类,例如SKSprite 节点。当mySprite是一个SKSpriteNode时Swift可以保证addChild得到一个SKSpriteNode。将 mySprite 转换为 SKSpriteNode 失败,因为 SKSpriteNode 不符合 ISprite,因此 Swift 不能保证它将成为 SKSpriteNode。您可以将 mySprite 转换为 MySprite,它是 SKNode 的子类,因此 addChild 可以接受它:
addChild(mySprite as MySprite)
我有一个简单的代码如下。 class MySprite(显示红色矩形)是从 class SKSpriteNode 和协议 ISprite 扩展而来的:
import SpriteKit
protocol ISprite {
func doSomething()
}
class MySprite: SKSpriteNode, ISprite {
var scence: SKScene?
init(theParent: SKScene) {
super.init(texture: nil, color: UIColor.redColor(), size: CGSizeMake(300, 300))
self.position = CGPointMake(500, 500)
scence = theParent
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func doSomething() {
}
}
class GameScene: SKScene {
override func didMoveToView(view: SKView) {
var mySprite:SKSpriteNode = MySprite(theParent: self)
self.addChild(mySprite)
}
}
代码可以编译,运行很好。但是,如下所示将 mySprite 的类型从 SKSpriteNode 更改为 ISprite 后,我无法将其转换/向下转换回 SKSpriteNode:
var mySprite:ISprite = MySprite(theParent: self)
self.addChild(mySprite as? SKSpriteNode!)
swift 编译器说错误:"Type SKSpriteNode does not conform to protocol ISprite"
关于错误和解决方案有什么想法吗?非常感谢!
addChild 需要一个不符合 ISprite 的 SKNode。它也可以采用 SKNode 的子类,例如SKSprite 节点。当mySprite是一个SKSpriteNode时Swift可以保证addChild得到一个SKSpriteNode。将 mySprite 转换为 SKSpriteNode 失败,因为 SKSpriteNode 不符合 ISprite,因此 Swift 不能保证它将成为 SKSpriteNode。您可以将 mySprite 转换为 MySprite,它是 SKNode 的子类,因此 addChild 可以接受它:
addChild(mySprite as MySprite)