问题标签 [protocol-oriented]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
113 浏览

swift - 为什么传递给函数的协议默认值不会改变,即使函数在子类化时会改变?

我有一个协议,我为其分配了一些默认值:

然后我有另一个符合更高级别协议的协议,但具有不同的默认值和功能实现:

然后我创建一个符合更高层协议的类,然后创建一个符合低层协议的子类:

但是,当我实例化这个较低的类时,它会显示一些奇怪的行为:

默认属性是正确的,但函数的默认实现似乎是两者的混合。

我想知道这里发生了什么?

0 投票
3 回答
60 浏览

swift - 协议数组元素是按值传递还是按引用传递?

我知道在 Swift 中结构是按值传递的,类是按引用传递的。

我想知道我是否创建了一个提供协议的数组存储元素。这些元素是通过值还是引用传递?

它是基于模型一个类或结构的定义吗?

0 投票
0 回答
64 浏览

swift - Swift Conforming Multiple Protocols 继承自 Same Protocol with Associated Type

我正在尝试构建一个发布者/观察者系统,以轻松观察来自 API 的数据更改并通过有关控制器的应用程序发布。

到目前为止,我所做的只是为单次观察工作。但是今天我遇到了一个问题,它阻止了一个UIViewController观察多个Publisher.

我不是为了防止混淆而分享整个代码,我认为下面的问题是主要原因。如果有解决方案,那么我的问题就解决了。

当我尝试扩展BaseClass以符合Two时,它会抛出

'Two' requires the types 'BaseClass.BaseType' (aka 'String') and 'Int' be equivalent

协议中还有其他方法,Base它们取决于BaseType参数。但正如我之前所说,我认为这不是问题所在。

有什么建议么?

更新:用例的更多细节

我的基本协议如下;

然后我需要一个解决方案,将符合观察者的不同类型添加到同一个数组中。应用类型擦除;

之后我们的用例就在这里。假设我们有一个AViewController需要来自 API 的关于Books 和s 的数据。Movie我没有包括 API 部分,因为它是另一层。

Publishable扩展BookList并且MovieList因为它们需要携带有关哪个Service对象可以发布它们的信息。BookListServiceMovieListService声明如下;

最后Observer是关于BookList和的协议MovieList

对于我们的最终用例AViewController

到目前为止,没有任何错误。然而,在这之后,如果扩展AViewController符合MovieListObserver抛出 'MovieListObserver' requires the types 'BookList' and 'MovieList' be equivalent

如果您需要进一步的更新,请告诉我。

更新:

我找到了这个主题,但无法以某种方式适用于我的情况。

0 投票
1 回答
131 浏览

swift - 协议继承 - 覆盖方法参数

我正在尝试将我的设计转换为pop. 但是,我被卡住了,并且我的方法已经有了一堆线程-尽管不是这个问题的重复-显然它们都是死胡同。

我的问题是,有没有办法覆盖从另一个协议继承的协议方法的参数类型?

我做了我的研究,我相信这不是协议的工作方式。我只是在寻找解决方案。

我尝试添加 aassociatedType并将Listener其用作里面的类型listen(_:)。但是这个解决方案限制任何类必须符合多个从Listener. 详细信息可以在这里找到

0 投票
0 回答
19 浏览

swift - 这是在swift中用面向协议的编程替换类继承的正确方法吗?

我尝试理解和应用面向协议的编程,但不确定我是否朝着正确的方向前进。

需要 @objc 关键字的方法不能放在协议扩展中,所以我看到其他人使用类的标准扩展。这是正确的方法吗?

此外,对于一个类的标准方法,将它们放在单独的协议中通常是一种好习惯,还是最好将它们放在自己的类中?