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

swift - 扩展关联类型等于 Void 的自定义类型

我的情况是我有一个包含associatedtype. 在等于 的情况下Void,我希望有一些默认行为(以使呼叫站点更方便)。我试图将示例归结为:

这个想法是,在泛型类型为 的情况Void下,传入一个函数(在示例中命名)是没有意义的(在我的场景中bar)。因此,我只想在这个特定的上下文中为这个函数提供一个默认实现。

当尝试执行上述操作时,我得到的声音与尝试限制例如包含特定类型的类型时Same-type requirement makes generic parameter 'T' non-generic发生的情况非常相似。Array一种解决方法是引入一个协议,但对于Void. 是否可以做我想做的事,或者这目前是 Swift 3 中的一个限制?

0 投票
1 回答
79 浏览

swift - 协议扩展中函数命名的分段错误 11

问题真的很简单。这会导致分段错误:

显然我不知道如何编写协议扩展了。有人帮忙吗?:)

0 投票
2 回答
116 浏览

swift - 面向协议的编程扩展变量初始化两次

这是情况。我有一个协议,以及它的扩展。

我制作了一个 ViewController 来符合这个协议,然后我将这个自定义的“aView”添加到我的 ViewController 的视图中。

我运行它。在我的控制台日志中,它打印了两次 init,我试图在我的自定义“aView”中做某事,但它失败了。(我在上面粘贴的代码进行了简化,以便很容易地表达我的意图)

任何人都可以解释原因或对其进行修复,我将不胜感激。

0 投票
2 回答
229 浏览

ios - UIButton 在向其添加扩展后停止在界面构建器中显示 UIControl 操作

我有最简单的用户界面 - 只有一个按钮:在此处输入图像描述

如您所见,我可以将任何事件(如 UITouchUpInside)从界面生成器拖到我的代码中。

但是,如果我向 UIButton 添加一些扩展,例如:

这些事件不再可见: 在此处输入图像描述

我正在使用 Xcode 版本 8.2 (8C38)

我可以以某种方式退回它们吗?它是 Xcode 中的错误吗?

0 投票
1 回答
300 浏览

swift - 从选择器调用协议扩展函数

我有名为 MenuDisplayable 的协议类。这个协议有一个扩展。

当我从 viewController 类中的#selector 调用“showMenu”函数时

我收到一个错误,例如“'#selector' 的参数是指未暴露给 Objective-C 的实例方法 'showMenu()'”

0 投票
1 回答
337 浏览

swift - 如何使用类型约束调用协议扩展默认实现

考虑以下示例:

输出很好:

但我不喜欢排队的演员(self as! ManObj).baseFunc()

事实上,我只打算将Model协议应用于ManObj. (但并非所有的子类ManObj都是Model!)所以,我尝试更改Model为:

但我遇到了错误:

list2.someFunc()<-error: 'Model' is not a subtype of 'ManObj'

那么,有没有办法让我在我约束Model.someFunc到之后触发?list2Modelwhere Self: ManObj

0 投票
1 回答
3457 浏览

swift - Swift 协议仅由特定类实现

我想创建一个仅由特定类及其子类快速采用的协议。我知道我可以使用这样的协议扩展

但是我的协议中的init方法将是一个由类或其子类实现的方法,并且只返回某些特定类型的对象。

像这样的东西。

或者我可以做这样的事情

但是有两个问题,

  1. 在第一种方法中,如果我在协议中放置一个 init 方法,它不允许我像-> People第一种方法中那样在其中放置一个 return 语句。

  2. 在第二种方法中,我必须在协议扩展中提供一个函数体,所以这件事是毫无疑问的,因为我不知道为这个通用实现返回什么特定类型。

所以任何建议我如何调用一个 init 方法并执行以下任一操作:

  1. 让协议(不是协议扩展)仅由特定类及其子类实现。
  2. 或者从协议扩展方法返回某个实例而不给出其主体。
0 投票
2 回答
1225 浏览

swift - 覆盖类扩展中的方法,快速约束到协议

我正在尝试将默认实现添加到 UIViewController 触摸开始通过协议扩展符合协议的所有控制器。在那里,触摸将被发送到所有实现此协议的控制器所具有的自定义视图。

这是初始状态:

我想要完成的是所有 UIViewControllers 都将触摸转发到 insideView 而没有以相同方式为每个控制器指定的情况。像这样的东西:

但这不会编译,说'尾随非泛型 UIViewController 扩展的 where 子句'

我试图以另一种方式定义它,如下所示:

虽然扩展名的格式正确,但编译器会抱怨,因为它不能“覆盖”协议扩展名中的内容。

我想要的是一个受协议约束的类扩展,例如我可以覆盖这个方法,而不是被迫在实现这个协议的所有控制器中复制粘贴代码。

编辑:根据建议的解决方案

我也想出了这个解决方案:

它做了我想要的,但感觉有点乱,因为所有的 UIViewControllers 都会继承这种行为,并会覆盖它的代码,检查它们是否实现了协议。

0 投票
0 回答
1299 浏览

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 实现。任何帮助,将不胜感激!

0 投票
2 回答
1059 浏览

swift - 协议扩展:无法分配给仅获取属性

在使用结构代替类来实现更面向协议的编程方法时,我遇到了一些访问控制难题。

我通过网络接收不同类型的消息,它们的原始形式只是一个字节数组。

所以我从一个协议开始。请注意,如何rawBytes仅将其标记为 { get } 调用者无法直接操作原始字节:

我试图保持线程安全并使用 Swift 的所有值类型、面向协议的优点,所以我现在使用结构而不是类创建不同的消息类型,并采用协议。

对于前 10 个字节,所有不同的消息类型共享相似的结构,例如:

  • 字节[0] = 权限字节
  • 字节[1] = 连接类型字节
  • ETC...

由于我使用的是结构,所以我没有继承。但是我仍然需要一些方法来在消息类型之间有类似的行为。好的,所以我使用协议扩展:

但是哎呀!rawBytes无法访问:

有没有办法解决?否则我所有的结构都会有很多样板代码(对我来说很糟糕),或者我将不得不打开 rawBytes(非常糟糕)