问题标签 [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 投票
4 回答
1358 浏览

ios - 如果 Element 符合给定协议,则扩展 Array 以符合协议

我想做这样的事情,但无法获得正确的语法或在网络上找到任何提供正确编写方式的地方:

所以我只想在这个数组的元素符合Array我的协议JSONDecodeable时才符合JSONCollectionElement.

这可能吗?如果是这样,语法是什么?

0 投票
1 回答
447 浏览

swift - Swift 2.0:协议扩展类方法返回 Self

为了扩展我的NSManagedObject子类的一些功能,我定义了一系列协议:

因此NSManagedObject,在其数据模型实体中具有标识符的每个都可以符合UniquelyIdentifiable.

为此,我正在使用 Swift 2.0 协议扩展,其中:

其中 find 定义为:

现在这些方法正确返回 Self? 并且编译器对编码时间保持沉默,但是在编译时它给了我这个错误Method 'findWithIdentifier(_:inContext:)' in non-final class must return 'Self' to conform to protocol 'UniquelyIdentifiable'

现在的问题是,如果不是在协议扩展中实现该方法,我只是扩展我的NSManagedObject子类,它会很好,但是当你在几十NSManagedObject个子类中完全复制相同的代码时,这会破坏协议扩展的目的。

任何解决方法,或者我真的错过了什么?

0 投票
1 回答
9762 浏览

swift - 协议扩展中的 Swift 属性观察器?

考虑以下:

我正在尝试观察vm属性并bind在注入时调用。但这不会编译错误说:

扩展可能不包含存储的属性

这是有道理的,因为协议不能强制属性为storedor computed

这可以在不引入的情况下完成class inheritance吗?

换句话说,我可以观察协议扩展内的属性变化吗?

0 投票
4 回答
1808 浏览

ios - 在协议扩展中添加 Target-Action 失败

我有一组视图控制器,它们将有一个菜单栏按钮。我为这些视图控制器创建了一个协议来采用。此外,我还扩展了协议以添加默认功能。

我的协议看起来像,

而且,扩展看起来像这样,

我的 viewController 采用了协议——

我的按钮显示得很好,但是当我点击它时,应用程序崩溃了

如果我在 ViewController 中实现该方法,它可以正常工作。但是我会在所有符合协议的视图控制器中复制代码。

我在这里做错什么了吗?提前致谢。

0 投票
2 回答
935 浏览

swift - Swift 协议扩展实现另一个具有共享关联类型的协议

考虑以下:

此代码编译。但是如果我注释掉关联类型的显式定义typealias A = String,那么由于某种原因,swiftc 无法推断出类型。

我感觉这与共享相同关联类型但没有通过例如类型参数化(可能关联类型不够强大/不够成熟?)的直接断言的两个协议有关,这使得类型推断模棱两可。

我不确定这是否是语言的错误/不成熟,或者我可能错过了协议扩展中的一些细微差别,这些细微差别理所当然地导致了这种行为。

有人可以对此有所了解吗?

0 投票
1 回答
585 浏览

objective-c - Objective-C 类型的 Swift 2 协议扩展和一致性

我有这样的设置:

还有一个像这样的 Swift 协议:

在一个新的 Swift 文件中,我尝试这样做:

我不断收到错误,Xcode 说“类型'模型'不符合协议'同步'”。Xcode 还一直建议我@objc在扩展程序中放置一个位置,但它似乎无法弄清楚它应该放在哪里。

我正在做的事情是不可能的吗?(它似乎在操场上的简单条件下工作 - 但显然我的 Objective-C 类是用 Swift 编写的)。

如果不可能,请帮助理解为什么会受到赞赏。

0 投票
1 回答
77 浏览

ios - 是否可以在类协议上创建 willSet 的默认实现

我要做的是在对象被替换为我的服务对象的委托时通知它。我想知道是否有一种方法可以创建 willSet 的默认植入,因此我不必为我创建的每个服务对象复制代码:

我真的不知道从哪里开始扩展的语法或者这是否可能。上面代码的错误在'willSet'行:“Exspected declaration”谢谢你的时间仍然不确定它是否可能,但我做了一些编辑以确保你可以访问定义的委托对象

0 投票
0 回答
39 浏览

swift - 协议扩展 - 无法找到匹配的属性

使用这些协议定义:

以及实现它们的类:

我会收到一个错误:

MyPresenter 不符合 Activable 协议

但是,当我将依赖项重新定义为具体类而不是协议时:

一切都是桃色的。如果协议的关联类型被解析为另一个协议而不是具体类型,那么匹配协议扩展似乎存在问题。

所以我想知道:我错过了什么吗?这是一个已知的问题?您知道任何解决方法吗?

0 投票
1 回答
115 浏览

ios - Swift 2 协议扩展使用

我正在尝试使用 Swift 2 赶上这种面向协议的编程酷炫,但我目前很迷茫。

我正在尝试将理论应用于实际用例,所以让我们从最明显的开始:

假设我有一个UITextField并且我想要有许多协议(例如电话、数字、长度限制……),这些协议符合UITextFieldDelegate并覆盖该textField:shouldChangeCharactersInRange:replacementString方法以完成所需的行为。

是否有可能拥有一个带有此扩展名的“Extensions.swift”文件并将所需的协议分配给一个UITextField(例如数字、长度限制)?那将非常有用。如果是这样,有没有办法将协议分配给一个UITextField出口,或者我需要继承 aUITextField并使其符合所需的协议?如果是这种情况,那么我认为使用协议扩展比使用旧的子类化没有太多优势。

0 投票
6 回答
4878 浏览

swift - 非最终类中的方法必须返回 `Self` 以符合协议

实现在协议扩展中返回的静态协议函数时Self,在扩展中的函数实现时出现错误(没有上下文显示的最小简化场景):

替换SelfP发生错误的行会导致编译器出现段错误(sig 11)(这似乎是传达类型不匹配错误的有效方式)。

将声明更改f()为 return P,以及在错误行替换SelfP,会导致编译成功,但是会丢失类型精度(并且需要在每个调用站点强制向下转换,并Self详细记录要求)。

对于此问题,是否还有其他不丢失通用返回类型的解决方法?

编辑:补偿缺乏上下文的更多细节:P是一个公共协议,将由库公开,以符合(和覆盖)各种类型,g()因此覆盖不是一种选择。最好不必更改为协议扩展以外的其他内容,因为库内部在许多地方都使用了它。鉴于这两个选项,更改 to 的返回类型是更好的选择。f()NSDataf()f()P

更新

从 Swift 4(可能是 3)开始,上面的代码按原样工作。