Swift 4中带有“ To”修饰的Objective-C协议方法名称

时间:2018-12-06 02:06:55

标签: objective-c swift

我在Objective-C中建立了一个.framework,并在使用Swift 4构建的iPhone项目中使用了它。.framework根据需要使用委托来调用方法。

我注意到,根据我在协议方法签名中是否使用“ To”一词,我在Swift中得到了非常不同的实现。例如,如果我将协议方法定义为:

- (void)myApiExited:(Api*)api;
- (void)myApiReadyToPresentViewController:(Api*)api;

然后在我的Swift项目中得到:

func myApiExited(_ api:XPINApi!) {}

func myApiReady(toPresentViewController api: Api!) {}

但是,如果我将方法签名更改为不包含单词“ To”,则实现中的方法名称将变为我希望的名称:

- (void)myApiReadyPresentViewController:(Api*)api;

结果:

func myApiReadyPresentViewController(_ api: Api!) {}

我很奇怪,单词“ To”会导致这种情况。我希望实现中的方法名称与协议中的相同。我是在做错什么还是这种错误?

2 个答案:

答案 0 :(得分:0)

这是设计使然,因为Objective-C导入程序选择了Objective-C名称中的约定以提供更适合的Swift名称。我找不到详尽的规则集,但是如果要指定Swift名称,可以使用NS_SWIFT_NAME。在我的头上,你会这样写:

- (void)myApiReadyToPresentViewController:(Api*)api
        NS_SWIFT_NAME(myApiReadyToPresentViewController(_:));

答案 1 :(得分:0)

您直到现在都从未想过为什么NSString方法

characterAtIndex:

在Swift中以

出现

character(at:)

它叫做 reamification ,自Swift 3起就已经存在。您直到现在都没有注意到它吗?

这是一种补偿一方面Objective-C / Cocoa方法命名约定和另一方面Swift约定的差异的方法-不仅包括Cocoa的冗长性,还包括Objective-C everything 是参数名称,而在Swift中,括号内的纯函数名称​​ ,括号内的纯函数名称​​ ,这意味着快速括号必须以某种明智且自动的方式插入

我在这里为您提供了规则的一般概念:

http://www.apeth.com/swiftBook/apa.html#_objective_c_methods

重命名器的工作原理是假设某些可可中传统的思维简单的命名约定。它们通常工作合理,但都是非常人为的,因此有时它们无法给出正确的结果。在这种情况下,它(错误地)假设您的“收件人”是介词,并在其之前进行拆分。

但是如果您的方法命名为applyGlueToApi:,它将以applyGlue(to:)的形式出现,您对此会感到非常满意。