我可以在Swift中编写Spotlight导入程序吗?

时间:2015-08-03 14:21:37

标签: macos swift spotlight

我需要为我在Swift中编写的应用程序编写一个Spotlight Importer,并且指的是Writing a Spotlight Importer的官方Apple指南。

看起来很简单,但是创建Spotlight Importer项目会为Objective-C实现创建默认设置。现在,使用Objective-C并不是一个大问题(我过去曾经使用过很多次)但是我为我的应用程序编写的所有内容都是在Swift中,所以我真的很想写Swift中的导入器也是为了避免在语言之间切换,所以我也可以共享一些我已经为读/写文件所做的代码。

首先,是否可以使用Swift而不是Objective-C编写Spotlight Importer?如果是的话,我应该从哪里开始(例如,如果我采用Objective-C起点,我会做什么来切换到Swift)?

2 个答案:

答案 0 :(得分:0)

由于Apple推出了 Swift 作为与任何现有Objective-C项目完美兼容的语言,我建议您先从让事情变得更容易的事情开始。< / p>

如果你最了解Swift那么没有什么能阻止你使用它 - 无论你想要什么样的项目。如果您想遵循为Objective-C 编写的教程而尚未针对Swift进行更新,我认为您有两个选择(我个人建议您选择现在的第二个选择):

  1. 从头开始编写Objective-C中编写的相同逻辑,现在在Swift 中(几乎所有可能在Objective-C中使用Swift都可以实现) ,也)。为此,您需要了解Objective-C的基础知识以及Swift中相应的语法和功能。

  2. 从Objective-C 开始,按照教程进行操作,一开始就更容易(不需要真正理解教程的详细信息)。然后使用混合和匹配Swift代码以及Objective-C代码来自定义代码以满足您的需求或使用您自己的预先存在的类扩展代码。

  3. 更具体地说,第二个选项:

    如果您想编写新类,只需使用Swift - 您可以完美地使用Swift中的Objective-C编写的所有内容,反之亦然。如果您认为需要更改已经在Objective-C中编写的类,您可以选择以下选项:使用新的Swift类扩展用Objective-C编写的类< / em>,重新编写特定文件在Swift中或只是编辑 Objective-C文件直接

    了解更多,了解如何将Swift代码与Objective-C混合搭配,我建议您阅读Apples official documentation。它是Apple工程师为开发人员编写的免费iBook“使用Swift with Cocoa和Objective-C”的一部分。

    不幸的是,苹果实际上似乎确实在目前为XCode 仅为Objective-C 提供了Spotlight导入器的模板。不知道为什么会这样 - 我看不到任何阻止他们支持Swift的东西。我们应该向Apples Bug Reporter报告这一点,以强调人们实际上是在要求这样做。

    希望我在这里没有忽略任何东西,否则我的回答将毫无意义。 ^^

    更新(请求) 以下是从哪里开始实施第一种方法的一些步骤

    • 首先使用最新的XCode版本创建Spotlight Importer项目 - 创建一个新“Cocoa Touch”类,其名称与预先创建的主要Objective-C类完全相同(例如“MySpotlightImporter”)
    • 在课程创建期间询问时选择Swift和“创建桥接标题” - 重新实现在Swift类中的ObjC-MySpotlightImporter类中编写的代码(您可能希望在Swift和Objective-C中创建一个具有Core Data支持的Cocoa App,以了解它们之间的差异) - 我不确定你是否可以在Swift中重写GetMetaDataFile.m ,我在测试中无法理解,所以你可能需要保留它(现在) - 如果您收到任何错误,指向某些缺少的配置,只需在项目“构建设置”中搜索相关文件/类并在那里应用更改

    我希望这有助于您入门并且足够具体。我试图自己做一些必要的更改,以便在Swift中提供一个示例项目,但不幸的是我无法在有限的时间内完成它。您可能需要考虑公开提供代码(例如,在GitHub上发布此处发布的链接),以防您决定自行移植,以便其他人也可以从中获利。

    祝你好运!

答案 1 :(得分:0)

我花了一点时间才能让它发挥作用。

我没有为mdimporter添加Swift代码,而是导入了已经为我的app设置的嵌入式框架。

我删除了除 main.c GetMetadataForFile.m 之外的所有示例代码。 在后者中,我导入了我的框架,其中所有功能现在都作为Swift代码。

构建的mdimporter已添加到应用程序中。 在文件检查器中将位置设置为相对于构建产品

然后,应用程序会将mdimporter添加为复制文件构建阶段。

  • 目的地:包装
  • 子路径:内容/库/ Spotlight

以下内容需要添加到运行搜索路径构建设置中,因为我们正在链接到应用程序的嵌入式框架。

@loader_path/../../../../../Frameworks

如果您遇到编译器错误,在构建应用程序时无法找到框架模块,则根据工作区的设置方式,您可能需要修改应用程序的方案

  • 关闭并行构建
  • 按以下顺序添加构建目标:
    1. 框架项目
    2. mdimporter project
    3. App项目

在框架中拥有所有逻辑的额外好处是,它可以在 Playground 中进行原型设计和验证。比调试mdimporter插件容易一百万倍。