一尘不染

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

swift

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

我最近转换为Swift 3,由于对Swift 3进行了所有重命名,因此它更新了几个API调用。我明白了。

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

这是没有意义的。而且Objective-C类仍然调用method readDeliveryInfoItems,因此这里有一些秘密。

我试过将Objective-C
readDeliveryInfoItems方法重命名为readDeliveryInfo,建立(Swift失败,因为它说该readInfo()方法不存在,这很好),然后将其重命名为readDeliveryInfoItems。但是,当我在此之后进行构建时,Swift会回想到该方法称为readInfo()。我希望这会欺骗Xcode刷新Swift桥接并将方法重命名为正确的名称readDeliveryInfoItems(),但事实并非如此。

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

更新以添加更多信息

我的Objective-C类的接口具有以下函数声明:

- (nullable NSArray<XMPPDeliveryInfoItem *> *)readDeliveryInfoItems;

但是在该类的Generated Interface(请参见下面的MartinR的注释)中,函数声明改为:

open func readItems() -> [XMPPDeliveryInfoItem]?

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

- (nullable NSArray<XMPPDeliveryInfoItem *> *)sentDeliveryInfoItems;

它们在Generated Interface中看起来正确:

open func sentDeliveryInfoItems() -> [XMPPDeliveryInfoItem]?

因此,我无法弄清楚为什么只有一个函数会出现此问题。


阅读 257

收藏
2020-07-07

共1个答案

一尘不染

翻译过程在以下详细描述

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

*只要匹配项 *在动词之后 开始,就可以从方法的基本名称中为 匹配类型修剪匹配项 例如,

extension UIViewController {
  func dismissViewControllerAnimated(flag: Bool, completion: (() ->

Void)? = nil)
}

变成:

extension UIViewController {
  func dismissAnimated(flag: Bool, completion: (() -> Void)? = nil)
}

据我所知,这种修剪算法是在StringExtras.cpp中实现的
(并且使用了很多启发式方法),而PartsOfSpeech.def
包含一个被视为 动词 的单词列表 例如

VERB(dismiss)
VERB(read)
VERB(send)

但是 不是 VERB(sent)。这就解释了为什么-稍微简化了您的示例-

@interface DeliveryInfo : NSObject
-(void)readDeliveryInfoItems;
-(void)sentDeliveryInfoItems;
@end

变成

open class DeliveryInfo : NSObject {
    open func readItems()
    open func sentDeliveryInfoItems()
}

类型名称在动词“ read”之后修剪,但不在非动词“
sent”之后修剪。(您可以通过更改第二个方法名称sendDeliveryInfoItems然后将其映射到来进行验证sendItems()。)

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

-(void)readDeliveryInfoItems NS_SWIFT_NAME(readDeliveryInfoItems());
2020-07-07