[英]Swift confine protocol to certain types of class only
我有一个仅分配给SKScene对象的协议。 从根本上讲,我可以强制执行某些属性和方法,从而使我知道自己的场景都可以执行某些操作,从而创建一个管理器类。 例如,所以我可以创建一个教程场景,例如,第1级,第2级等。
protocol GameSceneProtocol {
func performAction()
}
因此,现在在我的经理中,我的场景有一个弱变量(经理在场景中初始化)
weak var scene: SKScene?
我遇到的问题是我想调用与SKScene以及我的协议相关的方法。 例如
scene.addChild(modal)
scene.performAction()
我真正想要做的是:
weak var scene: SKScene, GameSceneProtocol
我使用此管理器的原因是因为我需要向场景中添加不同的模态视图(同样是教程和关卡),然后根据在这些模态中执行的操作来运行通用代码。 这些模式和功能在不同场景中是相同的,这就是为什么我尝试将它们移到单独的类中的原因。
有什么办法可以确保某个属性属于某种类型,但也符合协议?
我有一种感觉,我的设计在这里是错误的,应该有一种更好的方法来构造它。 可能创建一个基础场景类,我的实际场景继承自该类而不是协议。 这样,我可以避免重复相同的代码。
您想要的是一个子类
class SKSceneWithProtocol : SKScene, GameSceneProtocol
但是在这一点上,该协议本质上是没有意义的,您也可以只在子类中执行代码。
您的另一种选择是在需要使用场景时将其投射到协议上
if let sceneProtocol = scene as? GameSceneProtocol
{
//do stuff here
}
您可以使用协议组成来定义一个属性,其中对象必须既是SKScene
又是GameSceneProtocol
。 由于协议组合仅适用于协议(不适用于类),因此您还必须定义一个空的SKSceneProtocol
并通过扩展将该一致性添加到SKScene
。
protocol SKSceneProtocol { }
extension SKScene: SKSceneProtocol { }
protocol GameSceneProtocol { ... }
var object: (SKSceneProtocol & GameSceneProtocol)? = nil
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.