当前位置: 首页 > 面试题库 >

在子类中未调用Swift 3 ObjC可选协议方法

巢德华
2023-03-14
问题内容

我有以下类层次结构:

class ScrollableViewController: UIViewController, UITableViewDelegate { // ... }

实现一种UITableViewDelegate协议方法,例如tableView:willDisplayCellAt:

SpecificScrollableViewController继承自的类中,ScrollableViewController不再调用新的可选协议方法,例如tableView(_:heightForRowAt:)


问题答案:

tl; dr,您需要在函数声明之前添加其Objective-C声明,例如

@objc(tableView:heightForRowAtIndexPath:)
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
  // return stuff
}

借助《Swift 3迁移指南》,我被告知这是一个解决方案,其中指出:

如果在声明符合性的类的子类中实现可选的Objective-C协议要求,则会看到警告,“实例方法’…’几乎与协议’…’的可选要求’…’相匹配”

•解决方法:@objc(objectiveC:name:)在实现可选要求之前,使用原始的Objective-C选择器添加一个属性。

我相当确定这是一个错误:当协议方法位于子类中时,允许检查选择器功能的运行时动态似乎未在Grand Swift重命名中正确桥接。使用Objective-
C名称前缀函数声明可以正确地将Swift桥接到Objective-C,并允许canPerformAction:withSender:从Objective-
C内部查询Swift 3重命名的方法



 类似资料:
  • 问题内容: 我遇到了以下代码(Swift 3.1)中解释的问题: 因此,我希望在调用后应打印 _“ SubClassmethodA”_文本。但是由于某种原因,调用了from协议扩展的默认实现。但是,呼叫按预期方式工作。 是协议方法调度中的另一个Swift错误,还是我丢失了一些东西并且代码正常工作? 问题答案: 这就是协议当前调度方法的方式。 协议见证表(有关更多信息,请参见WWDC谈话)用于在协议

  • 问题内容: 在Swift中有可能吗?如果没有,那么是否有解决方法? 问题答案: 1.使用默认实现(首选)。 优点 不涉及Objective-C运行时 (至少没有明确 涉及 )。这意味着您可以使其符合结构,枚举和非类。同样,这意味着您可以利用强大的泛型系统。 *当遇到符合此类协议的类型时, *您始终可以确保满足所有要求 。它始终是具体实现或默认实现。这就是“接口”或“合同”在其他语言中的行为方式。

  • 在 Swift 中可能吗?如果没有,那么是否有解决方法可以做到这一点?

  • 调用方式 SOFARPC 在 Bolt 协议下提供了多种调用方式满足不同的场景。 同步 在同步的调用方式下,客户端发起调用后会等待服务端返回结果再进行后续的操作。这是 SOFARPC 的默认调用方式,无需进行任何设置即可。 异步 异步调用的方式下,客户端发起调用后不会等到服务端的结果,继续执行后面的业务逻辑。服务端返回的结果会被 SOFARPC 缓存,当客户端需要结果的时候,再主动调用 API 获

  • 问题内容: 指这里 A是预编译的Java类(我也有源文件)B是我正在编写的Java类 B扩展了A。 如何实现逻辑,以便A可以调用B拥有的方法。 以下是条件: 我不想触摸A(尽管没有其他解决方案,但这只是最后一个选择)。 我不想使用反射。 如前所述,如果需要,我可以修改A。哪种方式可能是可行的解决方案? 问题答案: 类应该定义将要调用的方法(可能是抽象方法,根据Paul Haahr的出色指南,A应该

  • 问题内容: 使用默认实现的Swift 2协议扩展遇到了一个问题。基本要点是,我已经提供了协议方法的默认实现,我将在实现该协议的类中重写该方法。该协议扩展方法是从基类中调用的,然后该基类将调用在派生类中已重写的方法。结果是未调用重写的方法。 我试图将问题提炼到最小的游乐场,以说明以下问题。 问题答案: 不幸的是,协议还没有这样的动态行为。 但是,您可以(在类的帮助下)通过在中实现并在中进行覆盖来做到