【发布时间】: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