转换为Swift 3重命名了我自己的Objective-C方法

Eth*_*n G 9 objective-c swift swift3

我有快速的类与我的Objective-C代码混合在一起.使用Swift 2.3,一切都很好并按预期工作.

我最近转换为Swift 3,它更新了几个API调用,因为Swift 3发生了所有重命名.这很好; 我明白了.

但是什么不好,Swift 3似乎已经在我的一个Objective-C类中重命名了一个方法.我拥有Objective-C类,并且调用了我想要的方法:readDeliveryInfoItems.但现在,在转换为Swift 3后,我无法.readDeliveryInfoItems()再在Swift类中调用了.它告诉我它已被重命名为.readItems().

这是没有意义的.Objective-C类仍然调用该方法readDeliveryInfoItems,因此这里有一些内容.

我已经尝试将Objective-C readDeliveryInfoItems方法重命名为readDeliveryInfo,构建(Swift失败,因为它表示该readInfo()方法不存在,这很好),然后将方法重命名为readDeliveryInfoItems.但是,当我在此之后构建时,Swift会重新思考调用该方法readInfo().我希望这会欺骗Xcode刷新Swift桥接并将方法重命名为正确的名称readDeliveryInfoItems(),但事实并非如此.

我怎样才能解决这个问题?

更新以添加更多信息

我的Objective-C类的接口有这个函数声明:

- (nullable NSArray<XMPPDeliveryInfoItem *> *)readDeliveryInfoItems;
Run Code Online (Sandbox Code Playgroud)

但是在该类的生成接口(参见下面的MartinR的注释)中,函数声明就是:

open func readItems() -> [XMPPDeliveryInfoItem]?
Run Code Online (Sandbox Code Playgroud)

该类中还有与该readDeliveryInfoItems函数类似的其他函数,例如:

- (nullable NSArray<XMPPDeliveryInfoItem *> *)sentDeliveryInfoItems;
Run Code Online (Sandbox Code Playgroud)

它们在生成的界面中看起来正确:

open func sentDeliveryInfoItems() -> [XMPPDeliveryInfoItem]?
Run Code Online (Sandbox Code Playgroud)

所以我无法弄清楚为什么我只用一个函数来解决这个问题.

Mar*_*n R 15

翻译过程详细描述

你问题的相关部分是(强调我的):

只要匹配在动词后开始,就从方法的基本名称修剪封闭类型的匹配项.例如,

extension UIViewController {
  func dismissViewControllerAnimated(flag: Bool, completion: (() -> Void)? = nil)
}
Run Code Online (Sandbox Code Playgroud)

变为:

extension UIViewController {
  func dismissAnimated(flag: Bool, completion: (() -> Void)? = nil)
}
Run Code Online (Sandbox Code Playgroud)

这个修剪算法 - 据我所知 - 在StringExtras.cpp中实现 (并使用大量的启发式),而PartsOfSpeech.def 包含被认为是动词的单词列表,例如

VERB(dismiss)
VERB(read)
VERB(send)
Run Code Online (Sandbox Code Playgroud)

不是 VERB(sent).这就解释了为什么 - 稍微简化你的例子 -

@interface DeliveryInfo : NSObject
-(void)readDeliveryInfoItems;
-(void)sentDeliveryInfoItems;
@end
Run Code Online (Sandbox Code Playgroud)

open class DeliveryInfo : NSObject {
    open func readItems()
    open func sentDeliveryInfoItems()
}
Run Code Online (Sandbox Code Playgroud)

在动词"read"之后修剪类型名称,但在非动词"sent"之后不修剪.(您可以通过更改sendDeliveryInfoItems随后映射到的第二个方法名称来验证sendItems().)

您可以使用以下方式覆盖映射NS_SWIFT_NAME:

-(void)readDeliveryInfoItems NS_SWIFT_NAME(readDeliveryInfoItems());
Run Code Online (Sandbox Code Playgroud)