在所有 Swift 项目中使用 Swift 静态库,构建和运行正常,编辑认为“没有这样的模块”

Jef*_*eff 5 xcode ios swift

我已经在这里阅读了与 Swift 和静态库相关的大部分问题。这个问题不是重复的,因为:

\n\n
    \n
  • 我正在使用/已经构建了一个 Swift 静态库。该功能直到 2017 年 9 月 19 日发布的 Xcode 9 才存在。
  • \n
  • 我在一个全 Swift 项目中使用 Swift 静态库。许多问题和答案都是从处理“.h”头文件、模块映射和/或与 Objective-C 互操作的基础开始的。
  • \n
  • 我正在使用 Swift 4.2 和 Xcode 10,它们于 30 天前发布。语言和工具的变化速度使许多旧方法失效。
  • \n
  • 我实际上已经构建了工作。是编辑误报了错误。
  • \n
\n\n

我在静态库中有以下代码:

\n\n
public extension String {\n    public func clever() -> String {\n        return self + "_clever"\n    }\n}\n\npublic class TestMe {\n    let word:String\n    public init(word:String) {\n        self.word = word\n    }\n    public func log() {\n        print("TestMe.word = \\(word)")\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我执行了静态库的“产品”>“存档”,并查看日志以查找输出。

\n\n

我有一个单页应用程序,与模板唯一不同的代码是:

\n\n
import UIKit\nimport StaticLib\n\nclass ViewController: UIViewController {\n\n    let t = TestMe(word:"banana")\n    let s = "bob"\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        let c = s.clever()\n        print("c = \\(c)")\n        t.log()\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是我将 .a 文件和 .swiftmodule 文件夹复制到应用程序的文件夹结构。

\n\n
2018-10-12T08:43:50 ~/Documents/Code/JustApp\n\xe2\x80\xb9master* M\xe2\x80\xba \xc2\xbb ls -lR Libs\ntotal 0\ndrwxr-xr-x  5 jeff  staff  170 Oct 12 07:43 StaticLib\n\nLibs/StaticLib:\ntotal 64\ndrwxr-xr-x  4 jeff  staff    136 Oct 12 07:43 StaticLib.swiftmodule\n-rw-r--r--  1 jeff  staff  29216 Oct 12 07:25 libStaticLib.a\n\nLibs/StaticLib/StaticLib.swiftmodule:\ntotal 40\n-rw-r--r--  1 jeff  staff    360 Oct 12 07:25 arm64.swiftdoc\n-rw-r--r--  1 jeff  staff  15068 Oct 12 07:25 arm64.swiftmodule\n
Run Code Online (Sandbox Code Playgroud)\n\n

它构建正常并运行。这是控制台输出。

\n\n
c = bob_clever\nTestMe.word = banana\n
Run Code Online (Sandbox Code Playgroud)\n\n

但这是它在编辑器中的样子。

\n\n

带有编辑器错误的示例代码

\n\n

以下是我更新的各种 PATH 设置。

\n\n

在此输入图像描述

\n\n

本次更新:

\n\n
    \n
  • FRAMEWORK_SEARCH_PATHS
  • \n
  • LIBRARY_SEARCH_PATHS
  • \n
  • FRAMEWORK_SEARCH_PATHS
  • \n
\n\n

有经验的人可能会告诉我,我缺少头文件和模块映射。但这个应用程序和库都是 Swift 的。我不需要头文件或模块映射。这就是 arm64.swiftmodule 文件的作用。

\n\n

那个人可能会继续说:“无论如何都要使用它们,因为这可能会解决编辑器问题。” 我尝试过,但这让问题变得更糟。

\n\n

我创建了这个模块映射:

\n\n
module StaticLib {\n    header "StaticLib-Swift.h"\n    export *\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我用的是StaticLib-Swift.h在“产品”>“存档”步骤中使用了 Xcode 生成的 和 。

\n\n

这就是我得到的。

\n\n

在此输入图像描述

\n\n

但同样,构建仍然成功,并且应用程序运行得很好!

\n

cia*_*uri 0

我在项目中通过设置解决了这个问题:

ONLY_ACTIVE_ARCH = NO;

未链接的静态库的构建设置中的标志。

如果它适用于“通用 iOS 设备”而不是其他目标,那么这是我首先想到的。

希望这对你有用!