【问题标题】:Template in Objective C?Objective C 中的模板?
【发布时间】:2012-04-20 01:51:21
【问题描述】:

一切都在标题中:)

ObjC 中有模板吗?

我需要相当于 c#:

public class MyClass<T> : Message

在 ObjC 中。

任何帮助将非常感谢:(

【问题讨论】:

  • 这是不可能的。如果您需要模板类,请查看 ObjC++。
  • 我看到了该功能,但不知道如何将 c++ 编译器添加到 XCode。
  • 只需将您的 .m 文件重命名为 .mm,GCC 会处理其余的。
  • 目前,当我尝试编译我的项目时,只有模板类声明,它说 -> 未知类型名称'模板'。
  • 您必须重命名所有包含 .h 文件的 .m 文件,其中包含 C++。

标签: objective-c ios class templates


【解决方案1】:

没有这样的 ObjC 功能。虽然 ObjC++ 确实存在,但我强烈反对广泛使用它。它存在许多问题,从工具和调试器支持不佳,到编译器优化不佳,再到 ARC 性能下降。

ObjC 通常不需要模板,因为它不是强类型语言。 NSArray 可以容纳任何对象,因此您无需使用模板来获取正确的类型。你有一个你想要解决的具体问题吗?可能有更好的 ObjC 解决方案。

【讨论】:

  • 是的。事实上,我需要在 c# 中将 byte[] 中的信息发送到服务器。我必须尊重相同的类组织,包括它们的名称、继承和模板。我需要重现的第一堂课是 public class MyClass : Message
  • 编写网络协议与类实现完全没有关系。但是,如果您发现音译代码更容易,那么编写一个纯 C++ 层,从 ObjC 获取和接收字节缓冲区。让 ObjC 与网络对话,让 C++ 解析和编码数据。然后,您也可以与 C# 共享相同的 C++。 stackoverflow.com/questions/935664/…
  • 我不选择它 :( 这是因为我必须遵循这个实现,因为我必须将这些类发送到 byte[] 中,以便服务器可以理解
  • 字节是字节。它们与编写它们的实现无关。我可以在 Perl 中写入与在 C# 中相同的字节。我可以用任何语言编写数据说“这条数据表示'x'上的模板实例化”,而无需语言本身支持模板。也许您可以打开一个新问题,详细说明您尝试读取和写入的数据格式,我们可以帮助您构建一个便携式系统来做到这一点。也就是说,将特定语言的对象序列化从一种语言转换为另一种语言总是充满挑战。
  • 顺便说一句,如果您需要的是与现有 C# 的紧密、低级集成,您应该查看 mono 项目。 mono-project.com
【解决方案2】:

Obj-C 从 Xcode v7 开始支持模板。它被命名为泛型:

轻量级泛型现在允许您为 集合类,例如 NSArray、NSSet 和 NSDictionary。方式 当您从 Objective-C 桥接时,信息改善了 Swift 访问, 并简化您必须编写的代码。例如:

NSArray<UIImage *> *images; 
NSDictionary<NSString *, NSURL *> *resourcesByName;

在中查找“Objective-C 语言更改”部分 https://developer.apple.com/library/content/documentation/Xcode/Conceptual/RN-Xcode-Archive/Chapters/xc7_release_notes.html

【讨论】:

  • 注意:这支持编译时检查而不是运行时强制。
【解决方案3】:

顺便说一句,Xcode 支持通过 New->File 添加 C++ 类。在 C++ 中使用 extern "C" {} 构造意味着您可以根据需要提供尽可能多或尽可能少的 C 可调用接口,然后您可以直接从您的 Objective-C 代码调用,因为 Objective-C 是 C 的超集.

话虽如此,但坚持使用 Objective-C 范例可能是个好主意,除非您有迫切的理由要移出它,例如需要将现有 C++ 代码主体合并到您的项目中。 (这并不是说 Objective-C 是一种“更好”的语言,这完全是另一回事。)

【讨论】:

    猜你喜欢
    • 2014-01-16
    • 2011-12-30
    • 1970-01-01
    • 1970-01-01
    • 2013-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多