gpt4 book ai didi

xcode - Swift:如何将协议(protocol)类型转换为特定协议(protocol)?

转载 作者:行者123 更新时间:2023-11-28 11:20:24 31 4
gpt4 key购买 nike

我有一个简单的代码如下。 MySprite 类(显示红色矩形)是从 SKSpriteNode 类和 ISprite 协议(protocol)扩展而来的:

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 编译器报错:“类型 SKSpriteNode 不符合协议(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)

关于xcode - Swift:如何将协议(protocol)类型转换为特定协议(protocol)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28665762/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com