问题标签 [swift-protocols]

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 投票
3 回答
3827 浏览

swift - 扩展 UICollectionViewDataSource 协议以添加默认实现

我有一个相当大的应用程序,它有很多集合视图。大多数集合视图对数据源和流布局委托具有相同的实现(相同的大小、边距等)。我正在尝试创建一个提供 UICollectionViewDataSource 和 UICollectionViewDelegateFlowLayout 的默认实现的协议。这是我的代码。

问题是,编译器抱怨 MyViewController 不符合 UICollectionViewDataSource。这不应该是这种情况,因为我明确表示如果类型是 TiledCollectionView,则添加默认实现。

有人可以帮忙吗?

0 投票
1 回答
428 浏览

swift - Swift 协议扩展中的“关联类型”难以理解

我正在努力快速理解协议和协议扩展。

我想定义一系列可应用于类的协议,以及一组协议扩展以提供默认实现。示例代码:

扩展中的上述覆盖函数rawValue()给出了错误Ambiguous type name 'ResultType' in 'Self'。如果我Self从 中删除,Self.ResultType我会收到错误消息'ResultType' is ambiguous for type lookup in this context

如何向协议扩展发出信号,使用哪种类型ResultType

我的目标是能够将协议及其扩展应用于一个类,如下所示:

以便:

如果我完全不了解协议扩展如何提供默认实现,那么我对如何实现相同结果持开放态度。

0 投票
1 回答
269 浏览

swift - 您如何区分已实现协议的静态方法?

对于实例函数,强制转换工作得很好。

0 投票
1 回答
10912 浏览

protocols - 在协议扩展中使用变异函数的 Swift 2 错误“不能在不可变值上使用变异成员:‘self’是不可变的

不知道这里发生了什么,这似乎应该很简单。我有一个可变 var 的协议,一个具有变异功能的扩展。testClass.testFunc中的事情正在崩溃,当我尝试使用扩展中声明的mtkAnimQueAppend时,我收到此错误:“不能在不可变值上使用变异成员:'self' 是不可变的。

0 投票
3 回答
20580 浏览

swift - 协议不符合自己?

为什么这段 Swift 代码不能编译?

编译器说:“类型P不符合协议P”(或者,在以后的 Swift 版本中,“不支持使用 'P' 作为符合协议 'P' 的具体类型。”)。

为什么不?不知何故,这感觉像是语言中的一个漏洞。我意识到问题源于将数组声明为协议类型arr的数组,但这是不合理的做法吗?我认为协议的存在正是为了帮助为结构提供类型层次结构之类的东西?

0 投票
1 回答
94 浏览

ios - 无法在受其他协议限制的泛型类型上调用协议方法

我有以下内容:

我希望将Guard协议分配给任意数量的不同类类型的对象,以及Prisoner其他对象。充当守卫的对象将根据它们的类类型有自己的 smack 实现。smackAll但我认为没有理由在每个可能继承的类中重新编写Guard. 所以我试图这样做,但编译器不允许我这样做。我错过了什么?

0 投票
1 回答
586 浏览

swift - 未能实现符合类型的协议扩展

(随时酌情重命名问题)

我正在处理大量 BLE 数据,出于调试目的,我发现UInt8使用HEX计算变量进行扩展很容易:

我发现自己想要一个小写的变体。UInt32然后我也想要它UInt16。由于唯一改变的是要打印的位数,我认为我可以使用某种协议来做到这一点(至少出于教育目的)。

然后是我想利用这一点并提供HEXandhex方法的默认实现的部分:

我得到一个编译器错误Argument type 'Self' does not conform to expected type 'CVarArgType'

我想我明白这一点。也就是说,作为一个协议,它不能保证采用的类型是CVarArgType可以在 String 初始化器中使用的类型 ( ) 。所以我想我可以where第一次使用子句。我修改了我的协议扩展,如下所示:

这导致Same-type requirement makes generic parameter 'Self' non-generic. 在这一点上,我的业余类型理论家的理解溢出了。使我在不同 UInt 大小上的两种扩展方法起作用的魔力是什么?

0 投票
1 回答
1112 浏览

swift - 使用 Swift 协议包装回调类型

假设我正在处理一个我无法控制的库,并且我正在尝试包装一个定义回调类型的类,以解耦我的代码以进行测试。这是模块内部的类AXSwift

这是用于测试的包装协议:

我得到Type 'Application' does not conform to protocol 'ApplicationProtocol'。如果我UIElementProtocol在 ApplicationProtocol 回调中更改回UIElement,它可以工作。但是UIElement符合UIElementProtocol,那么为什么这不起作用呢?

第二个问题:有没有更好的方法来设计库 API 以允许这种事情?

0 投票
1 回答
1654 浏览

swift - 协议中的 Swift 协议属性 - 候选人的类型不匹配

我有一个协议(ProtocolA),其中包含符合第二个协议(ProtocolB)的单个属性。

我正在尝试声明两个将实现这些的类:

但我收到一个错误:

类型“ClassA”不符合协议“ProtocolA”

协议需要类型为“ProtocolB”的属性“prop”?

候选人有非匹配类型“B 类?”

这很烦人,因为 ClassB 符合 ProtocolB。

在过去,我可能只是将属性声明为:

但似乎我可以快速解决这个问题的唯一方法是添加一个 ivar,例如:

有没有办法解决这个问题?

0 投票
2 回答
51 浏览

generics - 相关的协议一致性错误 swift 2.0

我知道这篇文章与我有同样的问题,但是没有答案而且很旧,所以我想在这里刷新它。

这是我需要的一个基本示例,但它说明了这一点

块 A 有效,但需要知道具体的单元格类,所以如果我有许多不同单元格的列表,一些我不知道具体类型的单元格将不起作用。

块 B 抛出此错误:

错误:协议“BaseCell”只能用作通用约束,因为它具有 Self 或关联的类型要求

有没有办法可以实现Block B?