Swift 在抽象基类上实现ExpressibleByStringLiteral
我有一个非常简单的类结构,其中一个“抽象”基类,Swift 在抽象基类上实现ExpressibleByStringLiteral,swift,literals,Swift,Literals,我有一个非常简单的类结构,其中一个“抽象”基类,节点,在几个具体的子类中实现。在我的例子中,基类表示对象的公共接口,因此为了简单起见,大多数类型引用都是纯粹的Node 然而,我现在想做的是在抽象的节点上实现对ExpressibleByStringLiteral的支持,这样当字符串被解释为节点时,我可以实例化一个特定的(我选择的)具体子类 问题在于ExpressibleByStringLiteral似乎不允许我这样做,因为它要求我实现一个必需的初始值设定项,而不是一个静态函数(在我看来,这样做更有
节点
,在几个具体的子类中实现。在我的例子中,基类表示对象的公共接口,因此为了简单起见,大多数类型引用都是纯粹的Node
然而,我现在想做的是在抽象的节点上实现对ExpressibleByStringLiteral
的支持,这样当字符串
被解释为节点
时,我可以实例化一个特定的(我选择的)具体子类
问题在于ExpressibleByStringLiteral
似乎不允许我这样做,因为它要求我实现一个必需的初始值设定项,而不是一个静态函数(在我看来,这样做更有意义)。我已经让它能够处理一个具体的子类,但是考虑到具体类型很少被显式使用(事实上我更希望不是这样),这对我来说是非常无用的,因为所有的东西都要通过基节点
类型
我想要的是能够做到这一点:
let node: Node = "textual representation of a node"
由于子类仍然是Node
s,这并不违反任何面向对象的原则,但是Swift似乎不想让我这么做
有没有办法解决这个问题,或者这只是ExpressibleByStringLiteral
的一个限制?Swift没有抽象类,你是说协议吗?我只是说在概念上它是抽象的,就像从未直接实例化一样。在这种情况下,是的,它是一个Swift限制,您可以将子类的一个实例包装在一个属性中,并转发所有方法调用和属性,但对我来说,这看起来像是一种黑客行为,在这种情况下,我会使用工厂(但您将失去ExpressibleByStringLiteral
advantages:/)看看Swift中的类集群或工厂初始值设定项将是非常棒的。我有点希望我们能回到初始设定者在Objective-C中的工作方式;它们在斯威夫特里太复杂了。