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

用Objective-C类别扩展Swift类

燕鸿波
2023-03-14
问题内容

我处于需要使用Objective-C类别扩展Swift类的情况。我做了如下的事情:

在“ SomeClass.swift”中:

class SomeClass: NSObject {
}

在“ SomeClass + Extension.h”中:

#import "Project-Swift.h"
@interface SomeClass (Extension) 
-(void)someMethod();
@end

效果很好。而且,如果我尝试在我的Objective C代码中使用SomeClass扩展,那就很好了。

问题是,如果要someMethod()在另一个Swift类中使用,则需要将SomeClass+Extension.h文件放入ObjC- BridgingHeader.h文件中。

但是这样做会导致循环依赖性,因为SomeClass+Extension.h还会导致import Project-Swift.h

有谁有解决这个问题的好方法?

请注意,仅在类别标头中向前声明该类是行不通的,因为类别本身无法使用正向声明,因此:

@class SomeClass不导入Project-Swift.h将给出编译错误。


问题答案:

坏人

我也一直在与这个问题作斗争。不幸的是,文档非常明确地指出不允许这种模式:

为避免循环引用,请勿将Swift代码导入到Objective-C标头(.h)文件中。相反,您可以转发声明Swift类或协议以在Objective-
C接口中对其进行引用。

Swift类和协议的前向声明只能用作方法和属性声明的类型。

同样在整个链接页面中,您会注意到它不断提及将生成的标头专门导入.m文件:

将Swift代码从同一目标导入到Objective-C

将Swift代码从该目标导入到该目标内的任何Objective-C .m文件中

善良

一个可能适合您的解决方案是创建一个快速扩展,重新定义类别中所需的每种方法。它既脆弱又丑陋,但可以说是最干净的解决方案。

/**
 Add category methods from objc here (since circular references prohibit the ObjC extension file)
 */
extension SomeClass {
    @nonobjc func someMethod() {
        self.performSelector(Selector("someMethod"))
    }
}
  • @noobjc在前面添加允许使用相同的方法签名,而无需覆盖ObjC实现
  • 现在import "SomeClass+Extension.h"可以从桥接头中删除

如果需要支持两个以上的输入参数,或者需要更紧密的类型耦合,我建议您使用运行时来调用基础函数。这里有一个很好的描述。



 类似资料:
  • 类扩展与类别有一些相似之处,但它只能添加到编译时具有源代码的类中(类与类扩展同时编译)。 类扩展声明的方法是在原始类的实现块中实现的,因此不能在框架类上声明类扩展,例如或类,如。 扩展名实际上是没有类别名称的类别,它通常被称为匿名类别。 声明扩展的语法使用关键字,就像标准的Objective-C类描述一样,但不表示子类的任何继承。 它只是添加括号,如下所示 - 扩展的特征 不能为任何类声明扩展,仅

  • 主要内容:1. 类别的特征有时,可能会发现希望通过添加仅在某些情况下有用的行为来扩展现有类。 要向现有类添加此类扩展,Objective-C提供了类别和扩展。 如果需要向现有类添加方法,或许为了添加功能以便在应用程序中更容易地执行某些操作,最简单的方法是使用类别。 声明类别的语法使用关键字,就像标准的Objective-C类描述一样,但不表示子类的任何继承。在括号中指定类别的名称,如下所示 - 1. 类别的特征 即使没有原

  • 本文向大家介绍在Swift中使用Objective-C编写类、继承Objective-C类,包括了在Swift中使用Objective-C编写类、继承Objective-C类的使用技巧和注意事项,需要的朋友参考一下 互用性(互操作性)使开发者可以定义融合了 Objective-C 语言特性的Swift类。编写 Swift 类时,不仅可以继承 Objective-C 语言编写的父类,采用 Objec

  • 本文向大家介绍Swift使用Objective-C代码中的Swift类,包括了Swift使用Objective-C代码中的Swift类的使用技巧和注意事项,需要的朋友参考一下 示例 在同一模块中 在名为“ MyModule ”的模块内,Xcode生成一个名为的标头,该标头MyModule-Swift.h将公共Swift类公开给Objective-C。导入此标头以使用Swift类: 相关的构建设置:

  • 问题内容: 我有一个旧的Objective-C项目,我想调用新的Swift函数和对象,我已经创建了文件“ ”和“ ” 对我来说,从Swift调用函数到Objective-C很容易,但是我有一个反向问题。 因此,我创建了一个简单的类“ System.Swift” 现在我尝试按照此处和文件内的文档进行操作 并且已将其导入到Objective-C类中。此时,在我的Objective-C代码的Object

  • 假设我在Swift中定义了一个泛型类,类似于以下内容: (我知道数组有一个稍微好一点的实现,这只是一个例子。) 在Swift中,我现在可以非常容易地使用这个类: 在Xcode 7中,我们现在在Objective-C中拥有泛型,所以我假设我可以在Objective-C中使用这个类: 然而,MyArray从未添加到我的<code>项目Swift中。h文件。即使我将其更改为从NSObject继承,它仍然