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
翻译过程详细描述
你问题的相关部分是(强调我的):
只要匹配在动词后开始,就从方法的基本名称修剪封闭类型的匹配项.例如,
Run Code Online (Sandbox Code Playgroud)extension UIViewController { func dismissViewControllerAnimated(flag: Bool, completion: (() -> Void)? = nil) }变为:
Run Code Online (Sandbox Code Playgroud)extension UIViewController { func dismissAnimated(flag: Bool, completion: (() -> Void)? = nil) }
这个修剪算法 - 据我所知 - 在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)
| 归档时间: |
|
| 查看次数: |
3136 次 |
| 最近记录: |