问题标签 [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.
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++ 处理方式)进行任何处理,还是根本不允许?
swift - 在 Swift 中扩展通用整数类型
所以我试图用一些我经常使用的方便的函数来扩展 Swift 的整数类型,但是我不清楚我应该扩展哪些协议。
例如,假设我想实现一个用于钳位值的函数(如果它小于最小值,则将其设置为该值,否则如果它大于最大值,则将其设置为该值)。我的第一个想法是做这样的事情:
有点简单的例子,但它说明了问题;如果我现在想把它称为 aUInt
那么我自然不能,所以我必须添加一个等价于UInt
,但这不适用于 aUInt16
等等。
我认为我也许可以在链上扩展一些东西,并改用泛型,但是IntegerType
似乎无法扩展诸如此类的协议。
那么,有没有更合适的地方可以放置我的扩展名?
swift - 扩展不同类时出现“不符合协议”错误
我试图通过注入适应URLSession
和URLSessionDataTask
协议的对象来测试我自己的类。我正在扩展NSURLSession
并NSURLSessionDataTask
采用这些协议,以便我可以正常使用现有对象,但在单元测试中使用测试对象。
我有以下代码,错误注释:
我理解这个错误,我的协议与 . 所暗示的方法不完全匹配NSURLSession
。我该如何解决?
swift - 如果它们是在协议扩展中定义的,如何在协议上调用静态方法?
Xcode 自动完成Car.foo()
正确,所以我要问的是它是否是一个无法编译的错误(说它没有名为 foo() 的成员)。如果它们是在协议扩展中定义的,您可以直接在协议上调用静态方法吗?
swift - swift 2中单元测试的存根方法
我发现很难在 swift 中对结构中的方法进行存根。我目前可以使用我将在下面解释的方式来做到这一点,但我感觉不对,希望对此发表意见。
我不使用任何第三方库进行存根,而是更喜欢覆盖我需要更改其结果的特定方法。在 swift 之前,我总是使用类——所以很容易继承和覆盖我需要在我的单元测试用例中模拟的方法。
现在我的大部分构造都是结构,因为它们并不需要是引用类型。但是我不能在我的测试用例中覆盖任何方法。我目前使用如下所述的协议扩展来执行此操作 -
在我的测试用例中
所以我的问题是 - 结构 A 没有真正需要通过协议来实现。其他任何类或结构都不会实现 AProtocol。但这是我可以模拟其单元测试方法的唯一方法。我认为关于协议扩展的 WWDC 会议也展示了这种单元测试方式,但基本上我不需要我的结构作为协议的实现。
有没有其他方法可以快速存根结构方法(不使用任何第三方库)?或者更好的方法来测试结构的方法。
ios - Swift 2:UITableViewDataSource 协议扩展
我一直在玩协议扩展,但遇到了问题。也许我想要达到的目标无法完成。我有这个游乐场:
这就是我所拥有和想要的:
- 我有一个协议 <code>ArrayContainer,它只有一个 typealias 和一个包含此 typealias 类型对象的数组
- 我有一个<code>UITableViewDataSource的协议扩展,当类符合<code>ArrayController协议时使用。这只是将数组的项目数作为行数返回。该
cellForRowAtIndexPath
方法没有很好地实现,但这不是问题。 - 我有一个名为<code>MyViewController的<code>UIViewController子类,它实现了这两种协议。
问题是编译器抱怨因为 MyViewController 不符合,UITableViewDataSource
但据我所知,它应该被 UITableViewDataSource 扩展覆盖。我在这里错过了什么吗?或者可能无法扩展 Objective-C 协议?
objective-c - 可以在 Objective-c 中访问的协议的扩展上定义 Swift 方法
是否可以从 Objective-C 调用 Swift 协议扩展中定义的方法?
例如:
一个实例的价格字符串IceCream
是 '$2' 并且可以在 Swift 中访问,但是该方法在 Objective-C 中不可见。编译器抛出错误“'IceCream' 的无可见 @interface 声明选择器 ...”。
在我的配置中,如果方法是直接在 Swift 对象的实现中定义的,那么一切都会按预期进行。IE:
ios - Swift 2.0 协议作为类型扩展
在操场上玩协议扩展时,我遇到了奇怪的错误。更准确地说,我声明了一个协议并以下列方式将其用作类型:
我接下来所做的是创建一个子类Controller
并尝试扩展该InvokeProtocol
特定类型
但这在我尝试调用时给了我以下编译时invokeC
错误SpecificController
@opened("70A8B09C-65E3-11E5-9A8E-6C40088AF546") InvokeProtocol' 不是 'SpecificController' 的子类型
我刚刚跳到 Swift 2.0,这是我第一次看到以 @opened 开头的错误。这是什么意思?这是一个等待修复的已知错误吗?如果是这样,你们有什么解决方法吗?
swift - 扩展 UICollectionViewDataSource 协议以添加默认实现
我有一个相当大的应用程序,它有很多集合视图。大多数集合视图对数据源和流布局委托具有相同的实现(相同的大小、边距等)。我正在尝试创建一个提供 UICollectionViewDataSource 和 UICollectionViewDelegateFlowLayout 的默认实现的协议。这是我的代码。
问题是,编译器抱怨 MyViewController 不符合 UICollectionViewDataSource。这不应该是这种情况,因为我明确表示如果类型是 TiledCollectionView,则添加默认实现。
有人可以帮忙吗?
ios - Swift 使协议扩展成为通知观察者
让我们考虑以下代码:
现在看一个实现 A 的 UIViewController 子类:
但令人惊讶的是,这会因错误而崩溃:
keyboardDidShow:]: 无法识别的选择器发送到实例 0x7fc97adc3c60
那么我应该在视图控制器本身中实现观察者吗?它不能留在扩展中吗?
以下事情已经尝试过。
使 A 成为类协议。将keyboardDidShow 添加到协议本身作为签名。