我将快速类与我的Objective-C代码混合在一起。使用Swift 2.3,一切都很好,并按预期工作。
我最近转换为Swift 3,由于对Swift 3进行了所有重命名,因此它更新了几个API调用。我明白了。
但是不好的是,Swift 3似乎已经在 我的 Objective-C类之一中重命名了一个方法。我拥有Objective- C类,并且将所需的方法称为:readDeliveryInfoItems。但是现在,在转换为Swift 3之后,我无法.readDeliveryInfoItems()再在Swift类中调用它了。告诉我它已重命名为.readItems()。
readDeliveryInfoItems
.readDeliveryInfoItems()
.readItems()
这是没有意义的。而且Objective-C类仍然调用method readDeliveryInfoItems,因此这里有一些秘密。
我试过将Objective-C readDeliveryInfoItems方法重命名为readDeliveryInfo,建立(Swift失败,因为它说该readInfo()方法不存在,这很好),然后将其重命名为readDeliveryInfoItems。但是,当我在此之后进行构建时,Swift会回想到该方法称为readInfo()。我希望这会欺骗Xcode刷新Swift桥接并将方法重命名为正确的名称readDeliveryInfoItems(),但事实并非如此。
readDeliveryInfo
readInfo()
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]?
因此,我无法弄清楚为什么只有一个函数会出现此问题。
翻译过程在以下详细描述
您的问题的相关部分是(强调我的):
*只要匹配项 *在动词之后 开始,就可以从方法的基本名称中为 匹配类型修剪匹配项 。 例如, extension UIViewController { func dismissViewControllerAnimated(flag: Bool, completion: (() -> Void)? = nil) } 变成: extension UIViewController { func dismissAnimated(flag: Bool, completion: (() -> Void)? = nil) }
*只要匹配项 *在动词之后 开始,就可以从方法的基本名称中为 匹配类型修剪匹配项 。 例如,
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)。这就解释了为什么-稍微简化了您的示例-
VERB(sent)
@interface DeliveryInfo : NSObject -(void)readDeliveryInfoItems; -(void)sentDeliveryInfoItems; @end
变成
open class DeliveryInfo : NSObject { open func readItems() open func sentDeliveryInfoItems() }
类型名称在动词“ read”之后修剪,但不在非动词“ sent”之后修剪。(您可以通过更改第二个方法名称sendDeliveryInfoItems然后将其映射到来进行验证sendItems()。)
sendDeliveryInfoItems
sendItems()
您可以使用以下方法覆盖映射NS_SWIFT_NAME:
NS_SWIFT_NAME
-(void)readDeliveryInfoItems NS_SWIFT_NAME(readDeliveryInfoItems());