我有一个我只分配给SKScene对象的协议。它基本上是这样我可以强制执行某些属性和方法,允许我创建一个经理类,知道我的场景都可以做某些事情。例如,我可以创建一个教程场景,例如1级,2级等。
protocol GameSceneProtocol {
func performAction()
}
所以现在在我的经理中我有一个弱的场景变量(经理在场景中初始化)
weak var scene: SKScene?
我遇到的问题是我想调用与SKScene相关的方法,但也要调用我的协议。 e.g
scene.addChild(modal)
scene.performAction()
我真正想要的是:
weak var scene: SKScene, GameSceneProtocol
我使用这个管理器的原因是因为我需要为我的场景添加不同的模态视图(同样是教程和关卡),然后根据这些模态中的操作运行公共代码。这些模态和功能在不同的场景中是相同的,这就是为什么我试图将它们移动到不同的类。
有没有办法可以确保属性属于某种类型,但也符合协议?
我有一种感觉,我的设计在这里是错误的,我可能有更好的方法来构建它。可能创建我的实际场景继承而不是协议的基本场景类。这样我可以避免重复相同的代码。
答案 0 :(得分:2)
你想要的是一个子类
class SKSceneWithProtocol : SKScene, GameSceneProtocol
但是在这一点上协议本质上是没有意义的,你也可以在子类中代替代码。
您的另一个选择是在需要使用时将场景转换为协议
if let sceneProtocol = scene as? GameSceneProtocol
{
//do stuff here
}
答案 1 :(得分:2)
您可以使用协议组合来定义对象必须同时为SKScene
和GameSceneProtocol
的属性。由于协议组合仅使用协议(而不是类),因此您还必须定义一个空的SKSceneProtocol
,并通过扩展名将此一致性添加到SKScene
。
protocol SKSceneProtocol { }
extension SKScene: SKSceneProtocol { }
protocol GameSceneProtocol { ... }
var object: (SKSceneProtocol & GameSceneProtocol)? = nil