当前位置: 首页 > 面试题库 >

转换为Swift 3重命名了我自己的Objective-C方法

呼延晋
2023-03-14
问题内容

我将快速类与我的Objective-C代码混合在一起。使用Swift 2.3,一切都很好,并按预期工作。

我最近转换为Swift 3,由于对Swift 3进行了所有重命名,因此它更新了几个API调用。我明白了。

但是不好的是,Swift 3似乎已经在 我的 Objective-C类之一中重命名了一个方法。我拥有Objective-
C类,并且将所需的方法称为:readDeliveryInfoItems。但是现在,在转换为Swift
3之后,我无法.readDeliveryInfoItems()再在Swift类中调用它了。告诉我它已重命名为.readItems()

这是没有意义的。而且Objective-C类仍然调用method readDeliveryInfoItems,因此这里有一些秘密。

我试过将Objective-C
readDeliveryInfoItems方法重命名为readDeliveryInfo,建立(Swift失败,因为它说该readInfo()方法不存在,这很好),然后将其重命名为readDeliveryInfoItems。但是,当我在此之后进行构建时,Swift会回想到该方法称为readInfo()。我希望这会欺骗Xcode刷新Swift桥接并将方法重命名为正确的名称readDeliveryInfoItems(),但事实并非如此。

我怎样才能解决这个问题?

更新以添加更多信息

我的Objective-C类的html" target="_blank">接口具有以下函数声明:

- (nullable NSArray<XMPPDeliveryInfoItem *> *)readDeliveryInfoItems;

但是在该类的Generated Interface(请参见下面的MartinR的注释)中,函数声明改为:

open func readItems() -> [XMPPDeliveryInfoItem]?

该类中还有其他与该readDeliveryInfoItems函数类似的函数,例如:

- (nullable NSArray<XMPPDeliveryInfoItem *> *)sentDeliveryInfoItems;

它们在Generated Interface中看起来正确:

open func sentDeliveryInfoItems() -> [XMPPDeliveryInfoItem]?

因此,我无法弄清楚为什么只有一个函数会出现此问题。


问题答案:

翻译过程在以下详细描述

  • SE-0005将Objective-C API更好地转换为Swift

您的问题的相关部分是(强调我的):

*只要匹配项 *在动词之后 开始,就可以从方法的基本名称中为 匹配类型修剪匹配项 例如,

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)。这就解释了为什么-稍微简化了您的示例-

@interface DeliveryInfo : NSObject
-(void)readDeliveryInfoItems;
-(void)sentDeliveryInfoItems;
@end

变成

open class DeliveryInfo : NSObject {
    open func readItems()
    open func sentDeliveryInfoItems()
}

类型名称在动词“ read”之后修剪,但不在非动词“
sent”之后修剪。(您可以通过更改第二个方法名称sendDeliveryInfoItems然后将其映射到来进行验证sendItems()。)

您可以使用以下方法覆盖映射NS_SWIFT_NAME

-(void)readDeliveryInfoItems NS_SWIFT_NAME(readDeliveryInfoItems());


 类似资料:
  • 问题内容: 我知道大多数问题都是关于从Objective-C转换为Swift的,但是我正在寻找一种可以将Swift代码转换为Objective-C的工具。搜索所有内容时,我发现目标是迅速发展。 是的-我知道我可以使用桥头将快速代码放入Objective-C项目中-这不是我想要的。 我需要一个将Swift代码转换为Objective-C代码的工具。有这样的事吗? 问题答案: 没有此类工具可将Swif

  • 主要内容:整型提升,通用的算术转换类型转换是一种将变量从一种数据类型转换为另一种数据类型的方法。 例如,如果要将值存储到简单整数()中,则可以将类型转换设置为。使用强制转换运算符将值从一种类型转换为另一种类型,如下所示 - 在Objective-C中,通常使用进行浮点运算,它是在位情况下从基本类型的派生的,在位情况下是类型。参考以下示例,使用转换运算符将一个整数变量除以另一个整数变量,结果为浮点数 - 执行上面示例代码,得到以下结

  • 问题内容: 我有一些Objective-C的遗留代码,它声明了像 如此处所写https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/AdoptingCocoaDesignPatterns.html Swift自动将产生错误的Objective-C方法转换为根据Swift的本机错

  • 我有一个类,它实现了Spring Security。但是,在登录请求的身份验证期间,它会给出一个,不能强制转换为我的类。 完整的错误: java.lang.ClassCastException:类org.springframework.security.core.userdetails.User不能转换为类nl.teamrepositories.vliegmaatschappij.security

  • 本文向大家介绍自己动手把ACCESS转换到SQLSERVER的方法,包括了自己动手把ACCESS转换到SQLSERVER的方法的使用技巧和注意事项,需要的朋友参考一下 在介绍教程之前,我们先来认识一下Access和SQL SERVER两种数据库。 Microsoft Office Access简介 Microsoft Office Access是由微软发布的关联式数据库管理系统。它结合了 Micr

  • @IsaAccisneros创建了新的SpinnerItem和MySpinnerAdapter类。我完全执行了他的新类。我的实现如下所示: 而他的长相是这样的: 那为什么我的行为怪异呢?我的代码的上下文是我的AddItemFragment在我的activity中的onCreateView。我说错了什么?谢谢! 编辑:已请求适配器类代码...