繁体   English   中英

Swift仅将协议限制为某些类型的类

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM