问题标签 [protocol-extension]

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 投票
0 回答
413 浏览

ios - Swift 2.0 中使用扩展协议的多协议继承

使用 Swift 2.0 中的新扩展协议可以通过以下示例进行:

类似于“多重继承”,某些语言(如 Python 和 C++)当然可以作为多重继承处理。真正让我吃惊的是 Xcode 7.0 Beta 4 给我的两个编译错误:

类型“C”不符合协议“A”


类型“C”不符合协议“B”

但是这个错误没有任何意义,因为错误必须反映协议之间存在冲突或歧义A以及B关于foo函数的使用,或类似的东西。

如果您在上面的代码下方放置以下行:

这恰好启动了我所说的错误类型:

'foo' 的模糊使用

我的问题是:

随着 Swift 2.0 中新添加的扩展协议,Apple 是否考虑过对这种“多重继承”(类似于 C++ 处理方式)进行任何处理,还是根本不允许?

0 投票
5 回答
2841 浏览

swift - 在 Swift 中扩展通用整数类型

所以我试图用一些我经常使用的方便的函数来扩展 Swift 的整数类型,但是我不清楚我应该扩展哪些协议。

例如,假设我想实现一个用于钳位值的函数(如果它小于最小值,则将其设置为该值,否则如果它大于最大值,则将其设置为该值)。我的第一个想法是做这样的事情:

有点简单的例子,但它说明了问题;如果我现在想把它称为 aUInt那么我自然不能,所以我必须添加一个等价于UInt,但这不适用于 aUInt16等等。

我认为我也许可以在链上扩展一些东西,并改用泛型,但是IntegerType似乎无法扩展诸如此类的协议。

那么,有没有更合适的地方可以放置我的扩展名?

0 投票
1 回答
557 浏览

swift - 扩展不同类时出现“不符合协议”错误

我试图通过注入适应URLSessionURLSessionDataTask协议的对象来测试我自己的类。我正在扩展NSURLSessionNSURLSessionDataTask采用这些协议,以便我可以正常使用现有对象,但在单元测试中使用测试对象。

我有以下代码,错误注释:

我理解这个错误,我的协议与 . 所暗示的方法不完全匹配NSURLSession。我该如何解决?

0 投票
2 回答
5325 浏览

swift - 如果它们是在协议扩展中定义的,如何在协议上调用静态方法?

Xcode 自动完成Car.foo()正确,所以我要问的是它是否是一个无法编译的错误(说它没有名为 foo() 的成员)。如果它们是在协议扩展中定义的,您可以直接在协议上调用静态方法吗?

0 投票
1 回答
784 浏览

swift - swift 2中单元测试的存根方法

我发现很难在 swift 中对结构中的方法进行存根。我目前可以使用我将在下面解释的方式来做到这一点,但我感觉不对,希望对此发表意见。

我不使用任何第三方库进行存根,而是更喜欢覆盖我需要更改其结果的特定方法。在 swift 之前,我总是使用类——所以很容易继承和覆盖我需要在我的单元测试用例中模拟的方法。

现在我的大部分构造都是结构,因为它们并不需要是引用类型。但是我不能在我的测试用例中覆盖任何方法。我目前使用如下所述的协议扩展来执行此操作 -

在我的测试用例中

所以我的问题是 - 结构 A 没有真正需要通过协议来实现。其他任何类或结构都不会实现 AProtocol。但这是我可以模拟其单元测试方法的唯一方法。我认为关于协议扩展的 WWDC 会议也展示了这种单元测试方式,但基本上我不需要我的结构作为协议的实现。

有没有其他方法可以快速存根结构方法(不使用任何第三方库)?或者更好的方法来测试结构的方法。

0 投票
1 回答
3053 浏览

ios - Swift 2:UITableViewDataSource 协议扩展

我一直在玩协议扩展,但遇到了问题。也许我想要达到的目标无法完成。我有这个游乐场:

这就是我所拥有和想要的:

  • 我有一个协议 <code>ArrayContainer​,它只有一个 typealias 和一个包含此 typealias 类型对象的数组
  • 我有一个<code>UITableViewDataSource​的协议扩展,当类符合​<code>ArrayController​协议时使用。这只是将数组的项目数作为行数返回。该cellForRowAtIndexPath方法没有很好地实现,但这不是问题。
  • 我有一个名为<code>MyViewController​的​<code>UIViewController​子类,它实现了这两种协议。

问题是编译器抱怨因为 MyViewController 不符合,UITableViewDataSource但据我所知,它应该被 UITableViewDataSource 扩展覆盖。我在这里错过了什么吗?或者可能无法扩展 Objective-C 协议?

0 投票
3 回答
10895 浏览

objective-c - 可以在 Objective-c 中访问的协议的扩展上定义 Swift 方法

是否可以从 Objective-C 调用 Swift 协议扩展中定义的方法?

例如:

一个实例的价格字符串IceCream是 '$2' 并且可以在 Swift 中访问,但是该方法在 Objective-C 中不可见。编译器抛出错误“'IceCream' 的无可见 @interface 声明选择器 ...”。

在我的配置中,如果方法是直接在 Swift 对象的实现中定义的,那么一切都会按预期进行。IE:

0 投票
2 回答
264 浏览

ios - Swift 2.0 协议作为类型扩展

在操场上玩协议扩展时,我遇到了奇怪的错误。更准确地说,我声明了一个协议并以下列方式将其用作类型:

我接下来所做的是创建一个子类Controller并尝试扩展该InvokeProtocol特定类型

但这在我尝试调用时给了我以下编译时invokeC错误SpecificController

@opened("70A8B09C-65E3-11E5-9A8E-6C40088AF546") InvokeProtocol' 不是 'SpecificController' 的子类型

我刚刚跳到 Swift 2.0,这是我第一次看到以 @opened 开头的错误。这是什么意思?这是一个等待修复的已知错误吗?如果是这样,你们有什么解决方法吗?

0 投票
3 回答
3827 浏览

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

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

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

有人可以帮忙吗?

0 投票
5 回答
8760 浏览

ios - Swift 使协议扩展成为通知观察者

让我们考虑以下代码:

现在看一个实现 A 的 UIViewController 子类:

但令人惊讶的是,这会因错误而崩溃:

keyboardDidShow:]: 无法识别的选择器发送到实例 0x7fc97adc3c60

那么我应该在视图控制器本身中实现观察者吗?它不能留在扩展中吗?

以下事情已经尝试过。

使 A 成为类协议。将keyboardDidShow 添加到协议本身作为签名。