【问题标题】:Cannot have a function with same name as parameter type不能有与参数类型同名的函数
【发布时间】:2016-02-06 19:45:31
【问题描述】:

我有一个符合 Objective-C 协议的类,并且有一个与它的参数类型之一同名的函数。

class MessageDataController: NSObject, MCOHTMLRendererDelegate {
    @objc func MCOAbstractMessage(msg: MCOAbstractMessage!, canPreviewPart part: MCOAbstractPart!) -> Bool {
        return false
    }
}

这会导致 Xcode 给出错误

“使用未声明的类型'MCOAbstractMessage'”

使用MCOAbstractMessage 作为函数名和参数类型。如果我将函数名称更改为 abstractMessage 或类似名称,它不会出错。我认为这个问题与this question 和/或this issue 有关,但我不确定如何解决。我的项目的头文件已正确配置为使用MailCore2

尝试将声明更改为:

@objc(MCOAbstractMessage:canPreviewPart:) func abstractMessage(msg: MCOAbstractMessage!, canPreviewPart part: MCOAbstractPart!) -> Bool

这给出了错误

"~/src/project/MessageDataController.swift:11:52: Objective-C 方法 'MCOAbstractMessage:canPreviewPart:' 由方法 'abstractMessage(:canPreviewPart:)' 提供与可选要求方法 'MCOAbstractMessage( :canPreviewPart:)' 在协议 'MCOHTMLRendererDelegate' 中"

【问题讨论】:

  • 你真的不应该使用大写的方法名...
  • 不是我的选择。该协议将此特定方法定义为- (BOOL) MCOAbstractMessage:(MCOAbstractMessage *)msg canPreviewPart:(MCOAbstractPart *)part;。请参阅 here 了解我正在尝试实施的协议。
  • 你的第一个方法是正确实现的。但是 Swift 代码无法理解 Objective C 中定义的@class MCOAbstractMessage
  • 有没有办法在不改变 ObjC 代码的情况下实现它?例如,有没有办法重新定义 SwiftObjC 名称映射?
  • 你能看看下面的吗? developer.apple.com/library/ios/documentation/Swift/Conceptual/… 并查找 NS_SWIFT_NAME。您可能有兴趣将补丁应用到 MailCore2 并向项目发送拉取请求。谢谢!

标签: ios objective-c swift mailcore2


【解决方案1】:

这可以通过在参数列表中使用完全限定的类型名称来解决。我不熟悉您正在使用的库,但下面的建议假定类型 MCOAbstractMessage 在名为 MCO 的模块中声明。在类型名称前添加 MCO.

class MessageDataController: NSObject, MCOHTMLRendererDelegate {
    @objc func MCOAbstractMessage(msg: MCO.MCOAbstractMessage!, canPreviewPart part: MCOAbstractPart!) -> Bool {
        return false
    }
}

我通过在我的一个类中添加一个名为 Array 的方法来测试这一点。果然,它在我使用Array 作为类型的其他地方抛出了编译器错误。我把所有这些都加上了Swift.Array 的前缀,一切都很好。

如果您想要更短的版本,请使用类型别名,

【讨论】:

  • 谢谢,但没用。如果有的话,我在哪里可以找到模块声明? Here 是我正在使用的库。
  • 作为后续,typealias 不起作用,因为我仍然收到帖子中提到的 Use of undeclared type 错误以及 Type alias circularly references itself 错误。
猜你喜欢
  • 2020-01-23
  • 2021-01-19
  • 2020-07-18
  • 2021-02-18
  • 1970-01-01
  • 1970-01-01
  • 2018-12-24
  • 2016-11-05
  • 1970-01-01
相关资源
最近更新 更多