【发布时间】:2016-10-20 14:21:55
【问题描述】:
我在我的 Objective-C 代码中混合了 swift 类。使用 Swift 2.3,一切都很好,并且按预期工作。
我最近转换到 Swift 3,它更新了几个 API 调用,因为 Swift 3 发生了所有重命名。我明白了。
但不好的是,Swift 3 似乎已经重命名了 my Objective-C 类之一中的方法。我拥有 Objective-C 类,我调用了我想要的方法:readDeliveryInfoItems。但是现在,在转换为 Swift 3 之后,我不能再在我的 Swift 类中调用 .readDeliveryInfoItems() 了。它告诉我它已重命名为.readItems()。
这没有任何意义。而且Objective-C类仍然调用方法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;
它们在生成的界面中看起来是正确的:
open func sentDeliveryInfoItems() -> [XMPPDeliveryInfoItem]?
所以我不明白为什么我只有一个函数会出现这个问题。
【问题讨论】:
-
您可以使用
NS_SWIFT_NAME来控制Swift 名称映射,参见例如以stackoverflow.com/questions/39203235/… 为例。 -
Swift 3 编译器不会更改您的 Objective-C 文件中的任何内容,它仅适应 Swift 方面的 Swift 3 命名约定。
-
@MartinR 谢谢……是的,这行得通……但在这种情况下,我真的不想为这种方法这样做,而且我绝对不认为我应该这样做到。
-
无论如何,看看 ObjC 接口和 Swift 映射的(最小)自包含示例会很有帮助。
-
您可以查看 C/Objective-C 标头的“生成的接口”,请参阅developer.apple.com/library/content/qa/qa1914/_index.html 以获取说明。
标签: objective-c swift swift3