【问题标题】:Xcode Swift: how to import a Swift projectXcode Swift:如何导入 Swift 项目
【发布时间】:2016-11-01 09:57:22
【问题描述】:

我创建了一个 Xcode Swift 项目(“Project1”)。在一个新项目(“Project2”)中,我无法添加项目 1。

我尝试将项目 1 添加到项目 2 的构建阶段(目标依赖项、编译源、将二进制文件与库链接);没用。添加到编译源时,无论我选择哪个选项(文件夹引用、组、如果需要,复制),它都不起作用。

我没有得到编译器错误:

import Project1

但是当我尝试使用项目 1 中的类时,我收到错误“使用未声明的类型”。

我也尝试过没有成功的链接:

这两个项目都使用 Swift (iOS)。

如果有人帮助我解决这个问题,我将不胜感激。

更新:项目 1 不是一个框架 - 它是一个 iOS 应用程序。我需要在项目 2 中使用它的一些类。问题是项目 1 通过桥接头使用 Objective C 库 Common Crypto。当我手动将项目 1 类添加到项目 2 中时,我在使用 Common Crypto 的项目 1 Swift 代码中收到错误(“未解析的标识符”)。

简而言之:我有一个 iOS 应用程序(项目 1),它在 Swift 中,但通过桥接头使用 Common Crypto。当我将项目 1 中的多个类添加到项目 2 中时,它无法解析对 Common Crypto 变量的引用(在项目 1 中)。

【问题讨论】:

  • 这可能与访问控制级别(Project1 中的私有、公共等)有关吗?您能否添加一些代码,向我们展示您如何尝试在 Project2 中使用 Project1 中的某些内容?
  • 看看 Heimdall.swift,它也使用 CommonCrypto 并且有一个 buildphase 脚本,你可以很容易地导入到 Project2 来解决这个问题。我有一个类似的设置可以做到这一点。你可以解决这个问题的唯一其他方法是使用一个不太好的伞式框架。链接:pastebin.com/1vmiqffu

标签: ios swift xcode


【解决方案1】:

假设Project1是一个框架,Project2是一个使用框架的应用程序:

  • 创建一个处女Workspace (Xcode File -> new -> Workspace) 命名为TestWorkspace
  • 从Finder,将Project1.xcodeproj文件拖到TestWorkspace
  • 从Finder,将Project2.xcodeproj文件拖到TestWorkspace上方Project1

编辑您的 TestWorkspace 架构 Build 设置:

  • 添加Project1和Project2
  • 确保Project1 高于Project2
  • 取消勾选“Paralellize Build”以确保首先构建Project1
  • 构建
  • 选择Project2s 目标 -> 常规
  • 将人工制品project1.framework(在Productsgroup)拖到“链接的框架和库”

注意:要对客户端可见,project1.framework 中的所有类和方法都必须是public 或open。查找详细信息in Apples documentation。

【讨论】:

  • 项目 1 不是框架。这是一个 iOS 应用程序,我想使用它的一些类。项目 1 完全使用 Swift,但它通过桥头使用了一个 Objective C 框架(通用加密)。我可以将所有类添加到项目 2 中,但是它会在项目 1 中使用通用加密的 Swift 类中显示“未解析的标识符”错误。
  • 好的。不过我误会了。我建议然后将加密的东西重构到一个框架中。
  • 没有更简单的方法吗?
  • 这很简单,也是我唯一推荐的方法
  • 您当然可以将文件复制到 Project2 以重复使用,并像在 Project1 中一样添加您的 Objective-C 加密框架。如果您对此有疑问,请搜索解决方案(因为它不适合此处的问题),如果没有找到解决方案,请在新问题中尽可能详细地描述您的设置和问题。
【解决方案2】:

编辑:由于您将 CommonCrypto 作为依赖项,因此您必须将 module 添加到您的 Project2 项目中来解决您的问题(这是最简单的,无需借助伞形框架)。添加run script build phase 并包含http://pastebin.com/1vmiqffu

-- 致谢:脚本“被盗”自:https://github.com/henrinormak/Heimdall

好的,所以我在这里假设Project1 实际上有一个框架作为目标。 您尝试使用的类型设置了哪些访问权限?

以下是我遇到的一些 Swift 和框架的流行语:

  • 您没有桥接头,而是您的框架在框架的头文件 (ModuleName.h) 中包含非 Swift 依赖项的标头。这也意味着这些将可用于您将它们导入到的任何项目。据我所知,您需要使用 module.modulemap 才能使用私有标头和包含。
  • 默认情况下,所有Swift 类/结构/定义通常都是内部的。这是一个非常好的设计选择,它迫使您考虑您编写的每个组件的访问权限。默认情况下保持私有可以更容易地只打开真正需要打开的东西(公共,开放),从而使代码维护更容易,因为您知道私有的东西只能在相同的上下文中访问。 (否则:错误)

要获得更多帮助,此链接可能对您如何做一些基础知识有所帮助:

your first ios framewok (swift)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多