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

core-data - 在受约束的协议扩展中的 swift Core Data KVO 中使用 setValueForKey 模棱两可

我有以下一段代码

任何想法为什么 setValue:ForKey: 会导致此错误?有趣的是, setValue:ForKeyPath: 不会导致这个问题。我只是害怕使用后者,因为它会导致任何副作用,并且除了 setValue:ForKey: 有什么想法吗?

0 投票
3 回答
2422 浏览

ios - Swift 协议扩展方法分派与超类和子类

我发现了一个有趣的行为,它看起来像一个错误......

基于以下文章描述的行为:

https://medium.com/ios-os-x-development/swift-protocol-extension-method-dispatch-6a6bf270ba94

http://nomothetis.svbtle.com/the-ghost-of-swift-bugs-future

SomeSuperclass当我添加而不是直接采用协议时,输出不是我所期望的。

你知道这是一个错误还是设计使然?一位同事建议混合继承和协议扩展可能无法按预期工作。我打算使用协议扩展来提供默认实现......如果我不能这样做,那么我将不得不标记它@objc并返回到可选协议。

0 投票
1 回答
744 浏览

swift2 - Swift 协议扩展:致命错误:不能在不同大小的类型之间使用 unsafeBitCast

我已经定义了一个带有协议扩展的协议,以简化使用NSError.

以下是该协议的使用方式:

以下是协议扩展方法的调用方式:

运行此代码时,调试器会中断在第二个generateError扩展函数中构建描述的行,并在调试器控制台中显示以下消息:

致命错误:不能在不同大小的类型之间使用 unsafeBitCast

请注意,如果我将调用替换为String(format:)just format,则一切正常。

问:我在这里所做的有什么问题?

除此之外,我无法检查协议扩展中的参数。当我尝试时显示以下消息:

0 投票
3 回答
1080 浏览

ios - 协议扩展不能满足 CLLocationManagerDelegate 一致性?

我正在尝试CLLocationManagerDelegate通过协议扩展来实现协议要求,但位置管理器在协议扩展中看不到它并且失败了。但是,它在移入类时使用相同的代码。

这就是我正在做的事情:

请注意,extension MyLocationProtocol我将didUpdateLocationsanddidFailWithError实现放在那里。他们从来没有被触发并且实际上崩溃说:'Delegate must respond to locationManager:didUpdateLocations:'。如果我将相同的didUpdateLocations代码didFailWithError移动到ViewController,一切都会按预期工作。

关于为什么这不能通过协议扩展工作,我有什么遗漏吗?该类被识别为符合CLLocationManagerDelegate,否则它将失败locationManager.delegate = self。关于如何进行这项工作的任何想法或某处是否存在错误?

0 投票
1 回答
755 浏览

swift - 如何在指定的初始化程序中调用协议扩展初始化程序?

我正在尝试将协议扩展初始化程序注入现有类的指定初始化程序。我认为没有办法解决它而不覆盖类中指定的初始化程序,然后在其中调用协议扩展初始化程序。

以下是我正在尝试的,特别是在UIViewController课堂上:

有没有办法利用协议扩展初始化程序,以便在框架现有的初始化过程中自动调用它?

0 投票
1 回答
576 浏览

ios - 可以动态地将逻辑附加到方法吗?

我想从类的初始化动态地将闭包附加到另一个方法。例如,UIViewController我想添加一个扩展,以便我可以在viewDidLoad事件中注入代码。我尝试了类似下面的方法,但它不起作用:

是否可以实现这一点,而无需从 ? 显式调用协议函数UIViewController?我不想遍历我所有的类并为每个函数调用协议函数。这将是乏味的、冗余的代码,并且很容易被忽略。有没有更优雅的方式?

更新:

鉴于限制,下面是我能想到的唯一方法,但它使用继承而不是组合,并且仍然需要我显式调用协议扩展函数,这不是我想要做的:

这违背了面向协议编程的全部目的。在 iOS 开发的范围内工作时,Swift 是否可以处理一种优雅的方法,或者 POP 在这种情况下不起作用?

0 投票
1 回答
1184 浏览

ios - 带有 Swift 扩展的协议方法的默认实现

我正在尝试使用如下的 Swift 扩展为委托方法编写默认行为,但它从未被调用。有谁知道为什么或如何以正确的方式做到这一点?

添加override也不起作用。

据此,Apple 的默认实现如下所示

我的 DataTask 调用通常如下所示:

哪里completion通常是通过参数接收的 Swift 闭包。

我需要为整个应用程序URLSession(... didReceiveChallenge ...)中的所有实现实现该功能nsurlsessiontask,但由于我需要使用 completionHandler(如下面的评论中所述),因此无法设置我的会话委托。

0 投票
1 回答
471 浏览

swift - Swift 协议扩展中是否允许混合类/协议类型约束?

是否有可能在任何版本的 Swift 中扩展具有混合类/协议类型约束的协议?例如,我只想扩展Protocol2whenSelf是的子类UIViewController并且符合Protocol1.

0 投票
1 回答
99 浏览

ios - 协议扩展无效 (Swift)

在撰写此问题时,我使用的是 Swift 2.1 和 Xcode 7.2.1。

下面的代码(用于编码 a struct)不起作用并使 Xcode 游乐场崩溃而没有错误。在项目中,它会在编译期间导致分段错误。

但这些可以工作。

0 投票
2 回答
10045 浏览

ios - 用于扩展非泛型类型的尾随 where 子句

我有以下代码:

在扩展至UIViewController. 许多视图控制器重用此代码来注册键盘通知。然而,对于 Swift 2.2,它会产生一个警告。我喜欢新#selector语法,但不确定在这种情况下如何实现它。

我认为正确的解决方案是制定一个协议并UIViewController仅针对符合该协议的实例进行扩展。到目前为止我的代码:

然而,这让我得到了错误

在扩展行上。有任何想法吗?