问题标签 [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 回答
867 浏览

ios - UIImagePickerControllerDelegate didFinishPickingMediaWithInfo 未调用

我有一个项目,其中有许多使用 imagePicker 的视图控制器。每次,我都必须再次复制 didFinishPickingMediaWithInfo 并且只更改一些代码。

然后我决定把 UIImagePickerControllerDelegate 和 UINavigationControllerDelegate 包装成我自己的协议,并扩展这个协议来实现 didFinishPickingMediaWithInfo。但是,根本没有调用 didFinishPickingMediaWithInfo。所有其他部分都运行良好,图像拾取器和相机视图显示良好,但完成拾取后,没有调用 didFinish 函数。

我在网上看到了一些建议,比如这个。他们使用具体类来扭曲这两个协议,而不是接口。

https://gist.github.com/rpassis/4622291029cd12e4ce2b7585d3e62d15

我不知道为什么我的解决方案是错误的,有人可以告诉我我的代码错误的原因。也许我误解了协议和协议扩展的某些部分。顺便说一句,我发现一个警告是

非'@objc' 方法'imagePickerController(_:didFinishPickingMediaWithInfo:)' 不满足'@objc' 协议'UIImagePickerControllerDelegate' 的可选要求

另一种解释来自 Swift 协议实现另一个 @objc 协议

我的代码如下所示。

扩展我的自定义委托

呈现 ImagePicker 的函数

0 投票
2 回答
368 浏览

swift - “自己呢?” 协议扩展内

我试图在协议扩展中投射“自我”。它在真实设备上运行时因 EXC_BAD_ACCESS 错误而崩溃,但在模拟器上运行良好。我应该怎么做才能完成这项工作?谢谢

我的整个代码:

0 投票
1 回答
1911 浏览

swift - 'Equatable' cannot be automatically synthesized in an extension

This works:

This doesn't:

The error is very clear:

implementation of 'Equatable' cannot be automatically synthesized in an extension

My concern is that according to Swift's proposal SE-0185, this should be allowed:

SE-0185: Synthesizing Equatable and Hashable conformance

Users must opt-in to automatic synthesis by declaring their type as Equatable or Hashable without implementing any of their requirements. This conformance must be part of the original type declaration or in an extension in the same file (to ensure that private and fileprivate members can be accessed from the extension).

It says this was implemented in Swift 4.1 (apple/swift#9619).

However, when trying to compile, I get the error previously shown. I'm using Ubuntu 16.04, it fails with these two versions of swift I've got:

  • Swift version 4.1-dev (LLVM 260a172ffb, Clang cd84be6c42, Swift 05b1b2be7c)
  • Swift version 4.2-dev (LLVM d30879863e, Clang 041fd44ebe, Swift b08fb12358)

Am I missing something?

0 投票
1 回答
293 浏览

ios - 调用协议扩展中的方法而不是视图控制器中的方法实现

所以我有一个包含自定义视图的 viewController,

并且 viewController 类符合ViewProtocol

我希望当someAction方法触发时someCustomizedView

它会打印" method in otherCustomizedClass called "

但它会打印出来(" method in extension Called")

theNotOptionalMethod效果很好,但不是可选方法。

我对协议扩展有什么误解吗?

请帮忙,已经挣扎了几个小时,谢谢

0 投票
0 回答
76 浏览

swift - 使用框架中声明的泛型访问协议扩展

我们可以访问在框架之外的框架中实现的协议扩展吗?我的意思是假设有一个目标说“框架”,我在其中声明了一个协议并实现了协议扩展。现在,如果我尝试在框架之外访问此协议,它会要求我重新实现协议方法。我们可以分享在框架中实现的扩展吗?

谢谢

Ankit

0 投票
3 回答
2029 浏览

ios - 调用协议扩展初始化程序

我正在尝试构建一组共享通用初始化代码的类。除了继承之外,我认为协议是要走的路。虽然协议和协议扩展对我来说适用于实例和静态方法,但我在使其与初始化程序一起工作时遇到了一些麻烦。

假设我们有这个协议:

现在假设我们要在协议扩展isConfigured中添加默认实现:init()

最后,让我们有一个类实现这个协议并尝试从它的默认实现中受益:

在尝试构建OneDriveWrapper类的新实例时,我根本找不到既调用类的初始化程序又调用默认协议实现的方法。并且不可能init()OneDriveWrapper类中省略 ,因为它是协议定义所必需的,并且似乎不被认为是通过协议扩展“实现”的。

事实上,更广泛地说,我找不到任何方法来显式调用协议扩展的初始化程序,即使我知道实例方法是可能的。

我究竟做错了什么?您知道将类的初始化程序和协议扩展的初始化程序结合起来的任何方法吗?我应该回到类继承而不是协议和扩展吗?

谢谢!

0 投票
1 回答
86 浏览

swift - 在非类绑定协议的扩展中,实例必须被视为值类型

这是代码:

我有点理解这里的问题,但我真的很想得到更深入理解的人的回答,更重要的是我的问题的解决方法,即我想传递已知的类类型并能够使用方便的访问器不受我无法使用值类型的限制。就我而言,定义这些方便访问器的协议不应该是类绑定的(它们对值类型完全有效且有用),因此虽然这在技术上是一种解决方法,但我并不满意。

0 投票
2 回答
185 浏览

swift - Swift 正确使用协议扩展

我正在尝试提取一些代码库以供重用。我的方法是使用ProtocolandProtocol Extension而不是 general BaseClass

我已经创建了以下一个protocolprotocol extension

在采用我这样声明的协议的主类中(使用默认实现refreshcontrol

问题是涉及的功能refreshcontrol不起作用。只有当我refreshcontrol在主类中显式声明变量并将扩展转换为函数并在主类中调用它时,它才有效,如下所示:

如何正确配置protocolprotocol extension默认实现?

0 投票
1 回答
77 浏览

swift - 如何在 Swift 存储属性中创建协议及其扩展?

以下是 Swift 中协议及其扩展不存储属性的“问题”的解决方法。它似乎“有效”,但我想知道人们可能有什么理由避免它?

(我意识到这个问题可以被解释为主观的顺便说一句)。

0 投票
1 回答
427 浏览

ios - 非'@objc' 方法'paymentAuthorizationViewControllerDidFinish' 不满足'@objc' 协议的要求

编译出错

非“@objc”方法“paymentAuthorizationViewControllerDidFinish”不满足“@objc”协议“PKPaymentAuthorizationViewControllerDelegate”的要求

如果我在 paymentAuthorizationViewControllerDidFinish 之前添加@objc,那么我会得到新的错误

@objc 只能与类的成员、@objc 协议和类的具体扩展一起使用。

我可以直接扩展 Handler ,PKPaymentAuthorizationViewControllerDelegate但我有两个不同的扩展类,ApplePayable我不想为不同的类编写相同的扩展