当前位置: 首页 > 知识库问答 >
问题:

在Objective-C中使用通用Swift类

卫宏硕
2023-03-14

假设我在Swift中定义了一个泛型类,类似于以下内容:

class MyArray<T> {
    func addObject(object: T) {
        // do something... hopefully
    }
}

(我知道数组有一个稍微好一点的实现,这只是一个例子。)

在Swift中,我现在可以非常容易地使用这个类:

let a = MyArray<String>()
a.addObject("abc")

在Xcode 7中,我们现在在Objective-C中拥有泛型,所以我假设我可以在Objective-C中使用这个类:

MyArray<NSString*> *a = [[MyArray<NSString*> alloc] init];
[a addObject:@"abc"];

然而,MyArray从未添加到我的<code>项目Swift中。h文件。即使我将其更改为从NSObject继承,它仍然不会出现在我的Swift中。h文件。

有没有办法创建一个通用的Swift类,然后在Objective-C中使用它?

更新:如果我尝试从NSObject继承并用@objc注释:

@objc(MyArray)
class MyArray<T>: NSObject {
    func addObject(object: T) {
        // do something... hopefully
    }
}

我收到以下编译器错误:

“@objc”类的泛型子类不能具有显式的“@obj”属性,因为它们在Objective-C中不直接可见。

这是否意味着没有办法在Objective-C中使用通用Swift类?

如何间接引用类?

共有2个答案

柯天宇
2023-03-14

在某些情况下,当您需要将Swift通用类导入Objective-C时,有一个变通方法。

假设您有使用泛型的Swift REST服务。我正在使用Moya框架,这就是我的服务的样子:

 class AuthService: BaseService<AuthAPI> {
    func register(email: String)  {
       // ... 
    }
 }

它是使用泛型从基本服务继承而来的,所以我不能在我的Objective-C代码中直接使用它。

所以这里有一个解决方法:

让我们创建身份验证服务协议

@objc protocol AuthServiceProtocol {
    func register(email: String)
}

然后让我们为服务创建一个工厂(或单例方法,没有区别):

@objc class Services: NSObject {
    static let authService: AuthServiceProtocol = AuthService()
}

然后我可以从Objective-C代码调用我的通用Swift身份验证服务:

- (void)someObjcMethod {
    [Services.authService registerWithEmail:self.email];
}
王成化
2023-03-14

Swift泛型类型不能在Objective-C中使用。

https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html#//apple_ref/doc/uid/TP40014216-CH10-ID136

这不包括Swift独有的功能,如以下所列:

  • 泛 型
  • ...
 类似资料:
  • 问题内容: 我正在将我的项目从Objective-c转换为Swift,并且正在使用一个Swift类,我正在尝试在Objective- c类中进行访问。我的问题是,在Objective-C类中不可访问。这是我的速成班: 当我查看文件时,看不到: 当我尝试在我的Objective-c类中使用时,出现编译器错误。 有人知道这个问题吗?如何在Objective-c中访问Swift协议? 问题答案: 您需要

  • 本文向大家介绍在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类: 相关的构建设置:

  • 问题内容: 简单地说,我有一个存储应用程序常量的结构,如下所示: 例如,可以通过调用在Swift代码中使用这些常量。但是在我的代码中,它还包含一些Objective- C类。所以我的问题是如何在Objective-C代码中使用这些常量? 如果这种声明常量的方法不好,那么在Swift和Objective-C代码中使用全局常量的最佳方法是什么? 问题答案: 可悲的是,你不能暴露,也不是Objectiv

  • 问题内容: 我正在尝试在我的Swift项目中使用第三方Objective- C库。我已经将该库成功导入到Xcode中,并且已经制作了一个文件,可以在Swift中使用Objective-C类。 但是,我似乎遇到了一个问题:Objective-C代码包含带有宏的文件。导入my 不会导致我的Swift应用程序可以使用的全局常量。 我做了一些研究,发现“复杂宏”下面的Apple文档说: “在Swift中,

  • 问题内容: 我在新的Swift项目中使用Objective-C Firebase框架时遇到麻烦。我主要来自C#背景,因此Swift闭合语法尚不清楚。 这是在f为Firebase对象的情况下在Objective-C中代码的工作方式 XCode auto建议使用这种语法,而我还没有找到可行的解决方案。 我想像Objective-C示例一样将FDataSnapshot数据分配给一个变量。谢谢 问题答案: