【问题标题】:Can I Write a Spotlight Importer in Swift?我可以在 Swift 中编写 Spotlight 导入器吗?
【发布时间】:2015-10-25 16:57:30
【问题描述】:

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

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

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

【问题讨论】:

    标签: macos swift spotlight


    【解决方案1】:

    自从 Apple 推出 Swift 作为一种语言以与任何现有的 Objective-C 项目完美兼容我建议你从任何让事情变得更容易的东西开始。

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

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

    2. 从 Objective-C 开始跟随教程,让事情一开始就更容易(无需真正了解教程细节)。然后利用混合和匹配 Swift 代码与 Objective-C 代码的巨大可能性来根据您的需要自定义代码或使用您自己的预先存在的类对其进行扩展。

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

    如果您想编写新类,只需使用 Swift - 您可以在 Swift 中完美地使用用 Objective-C 编写的所有内容,反之亦然。如果您觉得需要更改已经用 Objective-C 编写的类,您有以下选择:扩展用 Objective-C 编写的类新的 Swift 类,重写该特定文件在 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 项目 – 创建一个新的“Cocoa Touch”类,其名称与您预先创建的主要 Objective-C 类完全相同(例如“MySpotlightImporter”)
    • 在创建类时询问选择 Swift 和 “创建桥接头”重新实现代码在 Swift 类中的 ObjC-MySpotlightImporter 类中编写(您可能希望在 Swift 和 Objective-C 中创建一个支持 Core Data 的 Cocoa 应用程序,以了解它们的区别) – 我不确定你是否也可以在 Swift 中重写 GetMetaDataFile.m,我无法在我的测试中弄清楚,所以你可能需要保留它(现在) – 如果您在过程中收到任何错误,指向某些缺少的配置,只需在项目“构建设置”中搜索相关文件/类并在那里应用您的更改

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

    祝你好运!

    【讨论】:

    • 感谢您的回答,但我想我真的希望获得更多细节;我知道这有点糟糕,但是自从我上次不得不调整 Xcode 构建设置(除了一些小细节之外)已经有好几年了,因为默认值通常很好。如果我创建一个模仿 Objective-C 示例结构的新 Swift 文件,那么我如何实际设置它来构建 Spotlight 插件?您说得对,我们需要向 Apple 索取更多 Swift 示例,我实际上是想在发布此内容时完全忘记!
    • @Harvikk:我刚刚更新了我的答案,提供了一些更具体的步骤来帮助您入门。我实际上旨在为您提供一个示例项目,但事实证明移植主类比我想象的要多(至少对我而言)。我个人建议您采用第二种方法,将 Swift 代码与 Objective-C 代码混合匹配,只要 Apple 没有通过提供 Swift 示例(或至少说明)来“正式”支持 Swift。这样你至少可以使用用 Swift 编写的共享类(在链接的 Apple 文档中有很好的解释)。
    【解决方案2】:

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

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

    我删除了除 ma​​in.cGetMetadataForFile.m 之外的所有示例代码。 在后者中,我导入了我的框架,其中所有功能现在都以 Swift 代码的形式存在。

    构建的 mdimporter 被添加到应用程序中。 在 File Inspector 中,将 Location 设置为 Relative to Build Products

    然后该应用会添加带有 复制文件 构建阶段的 mdimporter。

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

    需要将以下内容添加到 Run Search Paths 构建设置中,因为我们正在链接到应用的嵌入式框架。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-08-15
      • 1970-01-01
      • 1970-01-01
      • 2012-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-01
      • 2015-11-03
      相关资源
      最近更新 更多