问题标签 [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 - Swift 协议扩展 `var { get }` 覆盖实现的 `let`
当将实现结构分配给类型为 的变量时,使用 和 实现属性的行为会var
有所不同。let
protocol
这是 Swift 的设计行为吗?
swift - 使用协议扩展的默认关联类型
我有一个带有associatedType
. 我想typealias
在协议扩展中为该类型提供默认值。这仅适用于从特定类继承的类。
协议扩展:
编译器抱怨'Bar' is ambiguous for type lookup in this context
. 我也无法在 swift book 中找到任何有用的东西。
ios - 如何创建返回确认类型的协议扩展?
我正在尝试实现一个协议扩展 JsonProcess,它有一个以 NSData 作为参数的函数,我想使用类似这样的自我要求创建不同的协议扩展
但编译器显示错误
无法将“登录”类型的返回表达式转换为“自我”类型的返回表达式
Login 类是这样定义的
如果我序列化 NSData 并创建 Login 类的实例填充它并尝试返回它,我应该在这里返回什么?
swift - Swift 协议扩展静态方法调度与超类和子类
我遇到了一个类似但略有不同的问题:Swift protocol extension method dispatch with superclass and subclass。
该问题与协议上的静态方法有关。
我有以下代码:
如果我从协议协议中删除了reuseID 声明,则该行为是“固定的”。这不是倒退吗?根据https://nomothetis.svbtle.com/the-ghost-of-swift-bugs-future 协议扩展的调度规则如下:
- 如果变量的推断类型是协议:
- 并且该方法在原始协议中定义然后调用运行时类型的实现,无论扩展中是否存在默认实现。
- 并且该方法未在原始协议中定义,则调用默认实现。
- ELSE IF 推断的变量类型是类型 THEN 调用类型的实现。
我观察到的行为恰恰相反。知道我做错了什么吗?
ios - Protocol extension methods don't get called when protocol extends existing Apple API protocol
I want a protocol to inherit from an Apple protocol UIViewControllerTransitioningDelegate
, add additional protocol requirements and provide a default implementation for some methods in that protocol. When I do that, the methods do not get called. When I implement the methods in the class itself, the methods do get called.
Here's what I'm talking about:
If I add the following code the functions do get called.
These methods I'm trying to provide a default implementation for are optional methods.
swift - ObjC 协议上的协议扩展
我有一个 Objective-C 协议,主要由 Objective-C 对象和一两个 Swift 对象使用。
我想在 Swift 中扩展协议并添加 2 个函数。一个用于注册通知,另一个用于处理通知。
如果我添加这些
我在#selector 上收到一个错误,上面写着:
'#selector' 的参数是指不暴露给 Objective-C 的方法
@objc
如果我在收到错误消息时标记 presetLoaded :
@objc 只能与类的成员、@objc 协议和类的具体扩展一起使用
我也无法将协议扩展标记为@objc
当我将 Objective-C 协议创建为 Swift 协议时,我得到了同样的错误。
有没有一种方法可以适用于使用该协议的 Objective-C 和 Swift 类?
ios - Swift 协议扩展:为 UIViewController 添加#selector
我正在尝试通过 swift 协议扩展将 UITapGestureRecognizer 添加到 UIViewController 。当我尝试使用#selector 初始化tapGestureRecognizer 时遇到问题。我在操场上设置了以下内容
在上述场景中,我收到编译器错误消息“#selector 的参数指的是未公开给 Objective-C 的方法
如果我在协议声明前加上@objc
ie ,我可以修复编译器错误
但是,如果我添加@objc
,我会在 UIViewController 中得到一个编译器错误,说“Type SomeViewController 不符合协议'Tapable'”。它还建议进行修复“候选人不是@objc,但协议需要它”。
点击这个 Fix-it 会在 setupTapGestureRecognizer 前面加上 @objc 在扩展名中(即@objc func setupTapGestureRecognizerInView(view: UIView) {
,但这并不能解决编译器错误,还会导致第二个编译器错误,告诉我删除 Fix-it 刚刚添加的 @objc
如何通过 UIViewController 的协议扩展添加#selector?
swift - 类不符合带有包含默认实现的扩展的协议
我目前正在学习 Treehouse IOS Swift 课程,我们正在构建一个天气应用程序。我已经到了一个地步,我不断收到我的课程不符合我的协议的错误,但我不知道为什么。
这是我的协议声明:
然后我有一个协议扩展,其中我在协议中声明了我的两个方法的默认实现,其中一个方法正在调用另一个方法,如下所示。
然后我有我的班级声明,我收到我的不合格错误。
我已经做了几个小时的大量阅读,试图弄清楚这里发生了什么。据我了解,我不需要在我的类中定义这两个方法,因为它们在协议扩展中有默认实现。我遇到了公共/内部类型的问题以及类似的问题,其他人在 StackExchange 上使用他们的扩展名,(正如你所看到的,我将事物标记为公共的等等),但这似乎没有帮助就我而言。我能够消除错误的唯一方法是在原始协议声明中注释掉那些方法声明。这似乎向我表明,由于某种原因,类或协议或某些东西没有看到扩展名,但是,如果我命令单击fetch
类声明中的方法调用,它将我带到扩展中的定义。我一直无法找到解决方案,甚至找不到正在做类似事情的人,Treehouse 上有几个人似乎也遇到了同样的问题。
另外,我下载了教师代码,并将其转换为 Swift 3,它也遇到了同样的错误,所以也许这是他制作视频时使用的 Xcode 版本不同的问题?
我觉得我有点抓住稻草了,但我真的很想弄清楚这一点,所以任何可能的帮助都会非常感激。
谢谢!
swift - Swift 3 混合协议、扩展和类继承的可能错误
我正在学习有关 swift、OOP 和 POP 的所有知识。当我遇到一些意想不到的行为时,我一直在将它们混合在一起以创建一个抽象基类。它最好用代码来表达,我将展示它按预期工作,然后按预期工作(至少对我来说)。代码很长,但很简单。在这里它工作正常:
这是输出:
这正是我所怀疑的。但是当第一个类没有 conforms() 的自定义实现时,我在我的应用程序中遇到了这个问题,如下所示:
请注意,TheUniverse 没有 conforms() 的自定义实现。这是输出:
前三行 print() 正是我所期望和想要的,但后三行真的让我感到困惑。由于 conforms() 是协议要求,因此它们应该与前三行相同。但是我得到的行为好像 conforms() 是在协议扩展中实现的,但没有列为协议要求。The Swift Programming Language 参考手册中没有关于此的内容。这段 WWDC 视频正好在30:40证明了我的观点。
那么,是我做错了什么,误解了功能,还是在 swift 3 中发现了一个错误?