Swift静态库

时间:2014-11-26 16:16:01

标签: ios swift

尝试创建一个在我公司的iOS应用程序之间共享的实用程序项目。我在之前的工作中完成了这项工作,但这种情况早于Swift。我显然希望将所有实现保留在swift中,而不是Obj-C。

我使用this guide尝试了cocoapod路线,但在我甚至可以开始在主项目中使用我的实用程序代码之前,存在构建问题。

我现在正在尝试使用“可可触摸静态库”,其语言为Swift,但仍然没有运气。我将整个.xcodeproj文件导入我的工作区。现在,我只有一个.swift文件,以及由XCode生成的头文件。 我的项目名为IosUtilsTest

特别是我的test util文件:

extension UIBarButtonItem {
  class func flexible() -> UIBarButtonItem {
    return UIBarButtonItem(barButtonSystemItem: .FlexibleSpace, target: nil, action: nil)
  }
}

在我的应用中:

import IosUtilsTest
....
toolbar.items = [UIBarButtonItem.flexible(), centeredButton, UIBarButtonItem.flexible()]
....

我收到flexible不存在的编译器错误。

我尝试在我的桥接标题中包含<IosUtilsTest/IosUtilsTest-swift.h><IosUtilsTest/IosUtilsTest.h>

基本上,似乎扩展未包含在构建中。 FWIW - 我记得有一个类别需要一个特殊的构建标志的问题,所以我尝试了一个我试图实例化的类,这是同样的基本错误。

1 个答案:

答案 0 :(得分:6)

我们有一个包含许多swift框架模块的项目,这些模块都集成在一个应用程序中,所以我应该能够提供一些帮助。

首先,您要创建一个Cocoa Touch Framework作为项目类型。

第一个让我感到困惑的是,框架中的所有内容都必须公开,因为它默认是内部的。好吧,至少要向客户端公开API的各个部分。所以使用:

public extension UIBarButtonItem {
  class func flexible() -> UIBarButtonItem {
     return UIBarButtonItem(barButtonSystemItem: .FlexibleSpace, target: nil, action: nil)
  }
}

您不应该再做这个,只需在.swift文件中导入您的模块,并在框架中包含与库的链接二进制文件。

我们也尝试过cocoapods,花了很多时间才无济于事。很多构建错误,所以我们放弃并使用了Git子模块。你是对的,它不如cocoapod设置好 - 但它对我们来说很好,只是稍微增加一点。如果您愿意,可以将子模块标记为.gitmodules中的“自动获取”。

如果让它起作用,要小心可可豆荚是暂时的,所有的应用程序都必须使用相同版本的Xcode构建。因此,如果您有一个使用旧版Xcode构建的模块然后放入可可pod,则需要确保在更新Xcode时重建它。这是由于与构建一起打包的swift运行时 - 请参阅Apples Swift博客了解更多详细信息。