【问题标题】:What are rules of parameter name shortening in ObjC protocols?ObjC协议中参数名称缩短的规则是什么?
【发布时间】:2021-12-24 17:56:22
【问题描述】:

我有以下问题: 我有快速实现的 ObjC 协议:

// ObjC protocol

@protocol PhonebookSomeEventCallback

- (void)onEvent:(nonnull NSUUID *)outUserId
   someNumValue:(int32_t)someNumValue
   lotOfPersons:(nonnull NSArray<PhonebookPerson *> *)lotOfPersons;

@end
//=====================================
// Swift impl
class PhonebookSomeEventCallbackImpl: PhonebookSomeEventCallback
{
    public func onEvent(_ outUserId: UUID,someNumValue: Int32,lotOfPersons: [PhonebookPerson])
    {
    }
}

构建失败并出现以下错误:

 error: instance method 'onEvent(_:someNumValue:lotOfPersons:)' has different argument labels from those required by protocol 'PhonebookSomeEventCallback' ('onEvent(_:someNumValue:lotOf:)')
    public func onEvent(_ outUserId: UUID,someNumValue: Int32,lotOfPersons: [PhonebookPerson])
                ^
                                                              lotOf 
Phonebook.PhonebookSomeEventCallback:3:10: note: requirement 'onEvent(_:someNumValue:lotOf:)' declared here
    func onEvent(_ outUserId: UUID, someNumValue: Int32, lotOf lotOfPersons: [PhonebookPerson])
         ^
/Users/g.a.igumnov/work/mobile/phonebook/controller/mobile-app/x86_64/subprojects/controller/service-sbis-phonebook/phonebook/djinni/swift/phonebook/PhonebookSomeEventEvent.swift:32:17: error: 'onEvent(_:someNumValue:lotOfPersons:)' has been renamed to 'onEvent(_:someNumValue:lotOf:)'
    public func onEvent(_ outUserId: UUID,someNumValue: Int32,lotOfPersons: [PhonebookPerson])
                ^
                                                              lotOf 
Phonebook.PhonebookSomeEventCallback:5:10: note: 'onEvent(_:someNumValue:lotOfPersons:)' was obsoleted in Swift 3
    func onEvent(_ outUserId: UUID, someNumValue: Int32, lotOfPersons: [PhonebookPerson])

通过实验,我发现了以下原则 如果参数名称以关键字之一结尾('of'、'with'、'by'、'from'、'on' - 我找到的那些)后跟类型名称(或其中的一部分,我有类 PhonebookPerson,但只有 Person 有效)数组的复数形式和非数组的单数形式,类型名称从参数名称中删除。

我有两个问题

  1. 是否有任何关于这种黑魔法的文档?
  2. 除了不写此类名称之外,还有什么正确的方法可以避免这种情况?

【问题讨论】:

  • 也许stackoverflow.com/questions/40157131/… 你可能有一些链接和阅读使用NS_SWIFT_NAME developer.apple.com/documentation/swift/… 你可能会强制重命名我认为的方法。
  • 主要问题是这段代码是自动生成的c++swift bridge,基于伪代码。而且我需要了解重命名工作的规则,以便能够生成正确的代码(或者至少向用户显示正确的错误,为什么他们不能这样命名他们的参数)。
  • 在链接的问题上,有一个链接“SE-0005 Better Translation of Objective-C APIs Into Swift”应该添加详细信息...

标签: ios swift objective-c


【解决方案1】:

我将您的协议放在我的测试项目中,并使用快捷方式让 xcode 自动生成协议功能,这就是它所做的

class PhonebookSomeEventCallbackImpl: PhonebookSomeEventCallback
{
    // I replaced the PhonebookPerson with UIView
    //
    // Also, ou can use auto-generation by complying with the protocol, compiling
    // and then pressing cmd+option+ctrl + F to have it generate the function
    func onEvent(_ outUserId: UUID, someNumValue: Int32, lotOfPersons: [UIView]) {
        <#code#>
    }

}

排除我对 UIView 的替换,您似乎在做正确的事情。

看起来你做的一切都是正确的,它如何将 obj-c 函数转换为 swift 并没有什么黑魔法。第一项没有参数名称,所有其他参数名称应为 1-1。

附:也可以在编译错误弹出后使用快捷方式自动生成函数

【讨论】:

  • 我无法使用快捷方式自动生成函数,因为此代码是由 python 脚本自动生成的,我需要了解规则才能在我的脚本中正确处理它们。虽然很奇怪,但在我的例子中,swift 编译器需要调用第三个参数 lotOf,而不是 lotOfPerson 和状态,自 swift3 以来,lotOfPerson 已过时
猜你喜欢
  • 2021-11-19
  • 2020-08-22
  • 2015-02-27
  • 2017-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-28
相关资源
最近更新 更多