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

Can I Write a Spotlight Importer in Swift?

我需要为我在 Swift 中编写的应用程序编写一个 Spotlight Importer,我指的是 Writing a Spotlight Importer.

的官方 Apple 指南

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

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

自从 Apple 推出 Swift 作为一种语言 与任何现有的 Objective-C 项目完全兼容 我建议您从让事情变得更轻松的事情开始。

如果您最了解 Swift,那么没有什么能阻止您使用它 – 用于您可能想要的任何项目。如果您想遵循为 Objective-C 编写且尚未为 Swift 更新的教程,我认为您有 两个选择(我个人建议现在选择第二个选项):

  1. 现在在教程Swift[=70=中写在Objective-C中写的相同逻辑 ] 从头开始​​(Objective-C 中几乎所有可能的东西在 Swift 中也很容易实现)。为此,您需要了解 Objective-C 的基础知识以及 Swift 中相应的语法和功能。

  2. 从 Objective-C 开始按照教程进行操作,让事情一开始就容易一些(不需要真正理解教程的细节)。然后使用 混合和匹配 Swift 代码 和 Objective-C 代码的巨大可能性来根据您的需要自定义代码或使用您自己预先存在的 classes.

更具体地说是第二个选项:

如果你想写新的classes只需使用Swift——你可以在Objective-C中完美地使用所有写在Objective-C中的东西Swift 反之亦然。如果您觉得需要 更改 class 已经写在 Objective-C 中的内容,您有以下选择:扩展 class 写在 Objective-C 中 new Swift class, re-write 该特定文件在 Swift 中或直接 编辑 Objective-C 文件 直接

了解更多 如何混合和匹配 Swift 代码以及 Objective-C,我建议阅读 Apples official documentation。它是 Apple 工程师为开发人员编写的免费 iBook "Using Swift with Cocoa and Objective-C" 的一部分。


不幸的是,Apple 目前似乎确实从 XCode 仅 Objective-C 中为 Spotlight Importer 提供了模板。不知道为什么会这样——我看不出有什么能阻止他们支持 Swift。我们或许应该通过 Apples Bug Reporter 报告这一点,以强调人们确实在要求这一事实。

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


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

  • 首先 使用最新的 XCode 版本创建一个 Spotlight Importer 项目 – 创建一个 new "Cocoa Touch" class 名称与您预先创建的主要 Objective-C classes 完全相同(例如 "MySpotlightImporter")
  • 在 class 创建过程中询问时选择 Swift 和 "Create Bridging Header"重新实现 Swift class 中 ObjC-MySpotlightImporter class 中编写的代码(您可能想要创建一个 Cocoa 在 Swift 和 Objective-C 中支持核心数据的应用程序以了解它们的区别) – 我也 不确定你是否可以重写 Swift 中的 GetMetaDataFile.m,我在测试中无法弄清楚,所以你可能需要保留它(暂时) – 如果您在此过程中收到 任何指向某些缺失配置的错误,只需在项目 "Build settings" 中搜索相关的 files/classes 并在那里应用您的更改

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

祝你好运!

我花了一些时间才让它起作用。

我没有向 mdimporter 添加 Swift 代码,而是导入了一个已经为我的应用程序设置的嵌入式框架。

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

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

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

  • 目的地:包装器
  • 子路径:Contents/Library/Spotlight

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

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

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

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

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