问题标签 [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.
swift - 这是 Xcode 中的错误还是程序员应该避免的做法?
首先,我寻找一种通过为协议函数提供默认参数值来简化编码的方法。我在这里采取了解决方案,然后发现它可能带来的一些致命的子序列:
我还发现这段代码在IBM Swift Sandbox中编译失败,因此假设 xcode 编译器可能是罪魁祸首。
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 方面是否有不同的方法来看待这个问题,或者我应该寻找一种更面向对象的方法?
swift - 协议扩展和子类化问题
因此,我想将面向协议的编程范式与 OOP 结合使用,将一些变量分配给主类,比如 UIView、UIImageView 等,然后在它们的子类中定义一些其他变量。为了实现这一点,需要将这些变量设为“可选”,而 Swift 的一种方法是扩展协议。一切都很好,直到我决定将这些子类实例添加到数组并稍后读取这些变量......这是同一个对象(相同的指针)但是在添加到数组后读取该变量时,它使用来自协议扩展的 getter不是来自子类的那个。
“来自 someView 的价值”
“来自扩展的价值”
我知道这是一个符合的对象数组,SomeProtocol
这可能是一个原因。问题是我想要一个符合该协议的不同类的对象数组,并且能够从那些对象而不是协议扩展访问getter。@objc
如果我使用协议和变量,这可能是可能的,optional
但我更愿意使用纯 Swift 解决方案。
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?
ios - 将类扩展继承子句迁移到协议扩展
我有一个框架,其中包含, ,VehicleModels
等类。在另一个框架中,我需要在表格中打印自定义描述(特定于第二个框架)。所以我添加了带有方法的协议。然后我为所有车辆添加了协议扩展,例如:Car
Bike
Plane
VehicleInventory
DescriptableVehicle
describe()
然而,假设已经改变,现在我没有从我的车辆框架中公开具体的类。相反,我公开了 , 之类的协议CarProtocol
,BikeProtocol
因此通常我拥有相同的信息。
问题是我不能再使用协议扩展(或者至少不能以那种形式),因为与类扩展相反的协议扩展不能有继承子句。
知道如何解决这个问题而不是过多地修改我的用法吗?最初,我认为where
协议上的几个子句加上几个演员会达成交易,但是如果没有访问类,它就没有帮助。我也尝试过适配器和类型擦除,但要么我使用不当,要么它用于不同的目的。
为了说明问题,我准备了存储库:https ://github.com/wedkarz/SwiftProtocolExtensionsProblem
有两个游乐场。V1是我曾经拥有并且正在工作的版本。 V2包含我现在拥有的以及我正在努力实现的功能。
在现实生活中,类PrivateFramework
是一个单独的框架和协议:VehicleProtocol
, CarProtocol
, BikeProtocol
,PlaneProtocol
是其中的一部分,但DescriptableVehicle
不是的一部分PrivateFramework
,因此不能在内部使用。该示例说明了访问具体类型的问题及其扩展的问题。
你可以看到有一些扩展被注释掉了,因为我不能再使用它们了。[VehicleProtocol]
目标是以与以前类似的方式打印其内容的集合。
swift - 当某些协议函数更改其签名时,我可以强制编译器失败吗?
有没有办法将某些 Swift 函数标记为实现某些协议函数,以便如果协议的签名发生更改,编译器可以将实现标记为错误。
例如,考虑这个例子,我有一个实例Foo
协议的默认实现UIViewController
,我想为一个自定义Bar
类覆盖它,它是UIViewController
.
现在,协议演变为:
如何帮助我的Bar
扩展程序意识到该number
功能不再与Foo
协议相关?
swift - 中止陷阱:具有类型别名定义的协议扩展中的 6 个
我有以下代码可以在 Xcode 9.2 标准构建系统中编译和运行,但是在使用或构建项目时swift build -c release
它不会编译并给出abort trap: 6
New Build System (Preview)
swift build
感谢您提前提供帮助。
swift - 快速理解协议扩展
我正在尝试实现一个基本的协议扩展,如下所示:
在该if
子句中,编译器说:Expression type 'Bool' is ambiguous without more context
. 为什么这不起作用?
swift - 空初始化协议
我正在使用一个具有“用户”协议的框架,该协议列出了所有所需的属性,该协议也有一个空的 init 方法。我需要创建一个用户,但我使用协议创建的任何实例都抱怨 init 没有初始化所有属性
框架协议
我将如何使用此协议创建自己的结构并向 init 上的参数添加值?
提前致谢!