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

swift - 这是 Xcode 中的错误还是程序员应该避免的做法?

首先,我寻找一种通过为协议函数提供默认参数值来简化编码的方法。我在这里采取了解决方案,然后发现它可能带来的一些致命的子序列:

我还发现这段代码在IBM Swift Sandbox中编译失败,因此假设 xcode 编译器可能是罪魁祸首。

0 投票
1 回答
242 浏览

swift - Swift 面向协议的混合作用域

我有一个面向协议的编程概念问题。假设我正在创建一个协议 Foo,并且我想在协议扩展中使用函数 action() 来扩展 Foo。action() 将始终基本相同,无论谁在实施,所以我不想重复这段代码。action() 中唯一改变的部分是 prop,prop 需要是实例属性。所以我的符合结构应该只需要定义道具,然后动作就会正常工作。这段代码很好,看起来像这样:

但现在问题来了。假设 prop 是我不希望其他类访问的信息。我希望他们只能通过 action() 访问它。在当前的 swift 中,prop 必须至少是内部的,因为协议是内部的,但我需要它是私有的,这样消费类就不会意外修改属性或读取我只希望它们通过 action() 访问的信息. 我可以将 action() 添加到协议中,但是每次结构符合时我都需要重写 action()。

同样的例子也可以扩展到一个函数:

action() 将始终是相同的实现,除了 cusotmAction()。因此,我需要符合标准的类来实现 customAction(),但我不希望任何外部类调用 customAction(),因为它只提供一些只能在 action() 内部使用的特定行为。因此我需要 customAction() 是私有的,但同样,这是不可能的。

所以这是我的问题,这只是面向协议编程的一个细分吗?我如何使用协议来编写这种类型的代码,而不给 prop/customAction() 太多的范围,或者不必一遍又一遍地重写 action() 内部的相同代码?这个例子相当简单,但我面临同样问题的更复杂版本。在 POP 方面是否有不同的方法来看待这个问题,或者我应该寻找一种更面向对象的方法?

0 投票
3 回答
834 浏览

swift - Swift 协议扩展,AssociatedType 被限制为集合,不能使用下标

我正在尝试编写一个符合 Collection Protocol 的协议,它有一个 associatedType - Object 和一个属性对象。

我想为 Object 也符合 Collection 协议的情况添加一些默认功能,即直接返回 Object 对这些必需的 Collection 属性和函数的实现。除了 Collection 对下标的要求之外,这一切似乎都有效。

无法使用“Self.Object.Index”类型的索引为“Self.Object”类型的值下标

在此处输入图像描述

0 投票
1 回答
158 浏览

swift - 协议扩展和子类化问题

因此,我想将面向协议的编程范式与 OOP 结合使用,将一些变量分配给主类,比如 UIView、UIImageView 等,然后在它们的子类中定义一些其他变量。为了实现这一点,需要将这些变量设为“可选”,而 Swift 的一种方法是扩展协议。一切都很好,直到我决定将这些子类实例添加到数组并稍后读取这些变量......这是同一个对象(相同的指针)但是在添加到数组后读取该变量时,它使用来自协议扩展的 getter不是来自子类的那个。

“来自 someView 的价值”

“来自扩展的价值”

我知道这是一个符合的对象数组,SomeProtocol这可能是一个原因。问题是我想要一个符合该协议的不同类的对象数组,并且能够从那些对象而不是协议扩展访问getter。@objc如果我使用协议和变量,这可能是可能的,optional但我更愿意使用纯 Swift 解决方案。

0 投票
2 回答
2459 浏览

swift - Swift generics extension to multiple classes

So I want to add a generic extension to NSNumber,Int,Double and Float where the value is converted to a formatted String.

I started by creating a custom protocol:

Now I'm trying to add the formatting to the extension:

But this doesn't seem to work as I'm getting the error:

Cannot invoke initializer for type 'NSNumber' with an argument list of type '(value: Self)'

Any hints on how to tackle this?

0 投票
1 回答
858 浏览

ios - 将类扩展继承子句迁移到协议扩展

我有一个框架,其中包含, ,VehicleModels等类。在另一个框架中,我需要在表格中打印自定义描述(特定于第二个框架)。所以我添加了带有方法的协议。然后我为所有车辆添加了协议扩展,例如:CarBikePlaneVehicleInventoryDescriptableVehicledescribe()

然而,假设已经改变,现在我没有从我的车辆框架中公开具体的类。相反,我公开了 , 之类的协议CarProtocolBikeProtocol因此通常我拥有相同的信息。

问题是我不能再使用协议扩展(或者至少不能以那种形式),因为与类扩展相反的协议扩展不能有继承子句。

知道如何解决这个问题而不是过多地修改我的用法吗?最初,我认为where协议上的几个子句加上几个演员会达成交易,但是如果没有访问类,它就没有帮助。我也尝试过适配器和类型擦除,但要么我使用不当,要么它用于不同的目的。

为了说明问题,我准备了存储库:https ://github.com/wedkarz/SwiftProtocolExtensionsProblem

有两个游乐场。V1是我曾经拥有并且正在工作的版本。 V2包含我现在拥有的以及我正在努力实现的功能。

在现实生活中,类PrivateFramework是一个单独的框架和协议:VehicleProtocol, CarProtocol, BikeProtocol,PlaneProtocol是其中的一部分,但DescriptableVehicle 不是的一部分PrivateFramework,因此不能在内部使用。该示例说明了访问具体类型的问题及其扩展的问题。

你可以看到有一些扩展被注释掉了,因为我不能再使用它们了。[VehicleProtocol]目标是以与以前类似的方式打印其内容的集合。

0 投票
3 回答
116 浏览

swift - 当某些协议函数更改其签名时,我可以强制编译器失败吗?

有没有办法将某些 Swift 函数标记为实现某些协议函数,以便如果协议的签名发生更改,编译器可以将实现标记为错误。

例如,考虑这个例子,我有一个实例Foo协议的默认实现UIViewController,我想为一个自定义Bar类覆盖它,它是UIViewController.

现在,协议演变为:

如何帮助我的Bar扩展程序意识到该number功能不再与Foo协议相关?

0 投票
1 回答
134 浏览

swift - 中止陷阱:具有类型别名定义的协议扩展中的 6 个

我有以下代码可以在 Xcode 9.2 标准构建系统中编译和运行,但是在使用或构建项目时swift build -c release它不会编译并给出abort trap: 6New Build System (Preview)swift build

感谢您提前提供帮助。

0 投票
3 回答
531 浏览

swift - 快速理解协议扩展

我正在尝试实现一个基本的协议扩展,如下所示:

在该if子句中,编译器说:Expression type 'Bool' is ambiguous without more context. 为什么这不起作用?

0 投票
1 回答
548 浏览

swift - 空初始化协议

我正在使用一个具有“用户”协议的框架,该协议列出了所有所需的属性,该协议也有一个空的 init 方法。我需要创建一个用户,但我使用协议创建的任何实例都抱怨 init 没有初始化所有属性

框架协议

我将如何使用此协议创建自己的结构并向 init 上的参数添加值?

提前致谢!