问题标签 [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 - 扩展关联类型等于 Void 的自定义类型
我的情况是我有一个包含associatedtype
. 在等于 的情况下Void
,我希望有一些默认行为(以使呼叫站点更方便)。我试图将示例归结为:
这个想法是,在泛型类型为 的情况Void
下,传入一个函数(在示例中命名)是没有意义的(在我的场景中bar
)。因此,我只想在这个特定的上下文中为这个函数提供一个默认实现。
当尝试执行上述操作时,我得到的声音与尝试限制例如包含特定类型的类型时Same-type requirement makes generic parameter 'T' non-generic
发生的情况非常相似。Array
一种解决方法是引入一个协议,但对于Void
. 是否可以做我想做的事,或者这目前是 Swift 3 中的一个限制?
swift - 协议扩展中函数命名的分段错误 11
问题真的很简单。这会导致分段错误:
显然我不知道如何编写协议扩展了。有人帮忙吗?:)
swift - 面向协议的编程扩展变量初始化两次
这是情况。我有一个协议,以及它的扩展。
我制作了一个 ViewController 来符合这个协议,然后我将这个自定义的“aView”添加到我的 ViewController 的视图中。
我运行它。在我的控制台日志中,它打印了两次 init,我试图在我的自定义“aView”中做某事,但它失败了。(我在上面粘贴的代码进行了简化,以便很容易地表达我的意图)
任何人都可以解释原因或对其进行修复,我将不胜感激。
swift - 从选择器调用协议扩展函数
我有名为 MenuDisplayable 的协议类。这个协议有一个扩展。
当我从 viewController 类中的#selector 调用“showMenu”函数时
我收到一个错误,例如“'#selector' 的参数是指未暴露给 Objective-C 的实例方法 'showMenu()'”
swift - 如何使用类型约束调用协议扩展默认实现
考虑以下示例:
输出很好:
但我不喜欢排队的演员(self as! ManObj).baseFunc()
。
事实上,我只打算将Model
协议应用于ManObj
. (但并非所有的子类ManObj
都是Model
!)所以,我尝试更改Model
为:
但我遇到了错误:
list2.someFunc()
<-error: 'Model' is not a subtype of 'ManObj'
那么,有没有办法让我在我约束Model.someFunc
到之后触发?list2
Model
where Self: ManObj
swift - Swift 协议仅由特定类实现
我想创建一个仅由特定类及其子类快速采用的协议。我知道我可以使用这样的协议扩展
但是我的协议中的init
方法将是一个由类或其子类实现的方法,并且只返回某些特定类型的对象。
像这样的东西。
或者我可以做这样的事情
但是有两个问题,
在第一种方法中,如果我在协议中放置一个 init 方法,它不允许我像
-> People
第一种方法中那样在其中放置一个 return 语句。在第二种方法中,我必须在协议扩展中提供一个函数体,所以这件事是毫无疑问的,因为我不知道为这个通用实现返回什么特定类型。
所以任何建议我如何调用一个 init 方法并执行以下任一操作:
- 让协议(不是协议扩展)仅由特定类及其子类实现。
- 或者从协议扩展方法返回某个实例而不给出其主体。
swift - 覆盖类扩展中的方法,快速约束到协议
我正在尝试将默认实现添加到 UIViewController 触摸开始通过协议扩展符合协议的所有控制器。在那里,触摸将被发送到所有实现此协议的控制器所具有的自定义视图。
这是初始状态:
我想要完成的是所有 UIViewControllers 都将触摸转发到 insideView 而没有以相同方式为每个控制器指定的情况。像这样的东西:
但这不会编译,说'尾随非泛型 UIViewController 扩展的 where 子句'
我试图以另一种方式定义它,如下所示:
虽然扩展名的格式正确,但编译器会抱怨,因为它不能“覆盖”协议扩展名中的内容。
我想要的是一个受协议约束的类扩展,例如我可以覆盖这个方法,而不是被迫在实现这个协议的所有控制器中复制粘贴代码。
编辑:根据建议的解决方案
我也想出了这个解决方案:
它做了我想要的,但感觉有点乱,因为所有的 UIViewControllers 都会继承这种行为,并会覆盖它的代码,检查它们是否实现了协议。
ios - 架构的未定义符号:*Extension where Self : Protocol* 引用自:*protocol.func* 的协议见证
在 Framework1 我有以下代码:
在将 Framework1 作为 Cocoa pod 导入的 Framework2 中,我像这样添加对 SomeProtocol 的一致性
Framework1 构建成功,但是,我在构建 Framework2 时收到以下 Apple Mach-O 链接器错误:
架构 x86_64 的未定义符号:“(Framework1 中的扩展):Framework1.SomeProtocol.doSomething () -> ()”,引用自:Framework1.SomeProtocol.doSomething () -> () 的协议见证,符合 __ObjC.UIButton : Framework1 SomeFile.old 中 Framework2 中的 .SomeProtocol:未找到体系结构 x86_64 的符号:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
如果我将 UIButton 的协议一致性移动到 Framework1 文件中,如下所示:
Framework1 将成功构建。这对我不起作用,因为我需要在 Framework2 而不是 Framework1 中建立 UIButton 与 SomeProtocol 的一致性。
我目前的解决方案只是删除
从 Framework1 并在 Framework2 的 UIButton 扩展中实现它,如下所示:
然而,这不是一个好的解决方案,因为我希望能够在任何使用 Framework1 的框架之间共享 UIButton 的 doSomething 实现。任何帮助,将不胜感激!
swift - 协议扩展:无法分配给仅获取属性
在使用结构代替类来实现更面向协议的编程方法时,我遇到了一些访问控制难题。
我通过网络接收不同类型的消息,它们的原始形式只是一个字节数组。
所以我从一个协议开始。请注意,如何rawBytes
仅将其标记为 { get }
调用者无法直接操作原始字节:
我试图保持线程安全并使用 Swift 的所有值类型、面向协议的优点,所以我现在使用结构而不是类创建不同的消息类型,并采用协议。
对于前 10 个字节,所有不同的消息类型共享相似的结构,例如:
- 字节[0] = 权限字节
- 字节[1] = 连接类型字节
- ETC...
由于我使用的是结构,所以我没有继承。但是我仍然需要一些方法来在消息类型之间有类似的行为。好的,所以我使用协议扩展:
但是哎呀!rawBytes
无法访问:
有没有办法解决?否则我所有的结构都会有很多样板代码(对我来说很糟糕),或者我将不得不打开 rawBytes(非常糟糕)