在Swift Project,Xcode中导入框架
我正在尝试将myFramework
导入到一个项目中。 我已经在Build Phases-> Link Binary With Libraries中添加了myFramework
。
Objective-c作品:
#import <UIKit/UIKit.h> #import <myFramework/myFramework.h>
但在Swift中,我得到一个No such module myFramework
错误:
import UIKit import myFramework
根据Swift文档 :
导入外部框架
您可以导入具有纯粹的Objective-C代码库,纯Swift代码库或混合语言代码库的外部框架。 无论框架是用单一语言编写还是包含来自两种语言的文件,导入外部框架的过程都是相同的。 在导入外部框架时,请确保您要导入的框架的“定义模块”构build设置为“是”。
您可以使用以下语法将框架导入到不同目标中的任何Swift文件:
迅速
import FrameworkName
您可以使用以下语法将框架导入到不同目标中的任何Objective-C .m文件中:
Objective-C的
@import FrameworkName;
我使用Xcode 5创build了myFramework
5没有“Defines Module”构build设置。
哪里有问题?
如果我正确地得到你,你的框架没有单独的构build目标(你已经使用XCode 5来构build它),并将框架包含到你的项目的构build目标中。
您所指的文档部分是关于不同目标中的框架。 由于你的框架在项目目标中,所以这部分文档不适用于此。
在你的情况下,你不能在你的Swift文件中导入框架。 这就是为什么你会得到错误信息“没有这样的模块myFramework” 。 myFramework不是模块 – 它是您项目模块的一部分(默认由您的产品名称决定)。 因此,您的框架中的类应该是可访问的。
不过你的框架是用Objective-C编写的。 所以你必须做的是在你的桥接头中导入Swift面向类,如下所述。
请注意,这与Swift导入模块无关。 bridging-header文件中的import指令只是通知编译器将Objective-C头文件“翻译”为Swift语法,并使Swift中的公共头文件可见。
那么你现在应该怎么做?
-
首先在桥接头中导入你感兴趣的头文件。 你只需要导入你将在Swift中交互的头文件。
-
尝试在这个阶段编译你的项目。 如果XCode无法find框架的头文件,那么您的问题可能与Swift或XCode 6无关,但通常包含框架的问题。
- 之后,尝试实例化您在桥接头中导入的类,也许在您的AppDelegate.swift中。 XCode自动完成应该为您提供types名称。
希望这可以帮助。
根据Swift文档
从相同的目标中将Objective-C代码导入Swift
在您的Objective-C桥接头文件中,导入您想暴露给Swift的每个Objective-C头文件。 例如:
#import "XYZCustomCell.h"
#import "XYZCustomView.h"
#import "XYZCustomViewController.h"
在“构build设置”下,确保Swift编译器 – 代码生成下的Objective-C桥接头构build设置具有标题的path。 path必须直接到文件本身,而不是它所在的目录。path应该是相对于您的项目,类似于在“生成设置”中指定Info.plistpath的方式。 在大多数情况下,您不需要修改此设置。
在这个桥接头文件中列出的任何公共Objective-C头文件对于Swift都是可见的。 Objective-Cfunction将自动在该目标中的任何Swift文件中提供,而不需要任何导入语句。 使用您的自定义Objective-C代码,使用与系统类相同的Swift语法。
let myCell = XYZCustomCell() myCell.subtitle = "A custom cell"
另外,确保“Packaging”下的“Defines Module”编译设置被设置为“Yes”。
在Swift上:
创build框架: –
-
启动Xcode – >创build一个新的Xcode项目 – > iOS – >框架&库 – > Cocoa Touch框架 – >命名框架(例如sampleCocoaFramework) – >创build。
-
设置Taget – >常规 – >部署信息 – >部署目标。
-
添加一个公共类:文件 – >新build文件 – > iOS – > Swift文件 – >命名它(例如openCocoaClass) – >创build。
-
现在添加一些代码到openCocoaClass.swift。
import Foundation public class openCocoaClass { public init() { } public var samplePublicVariable = "samplePublicVariable @ openCocoaClass" public func samplePublicFunction() { print("samplePublicFunction @ openCocoaClass") }
}
-
清理项目:产品 – >清洁
-
configurationscheme设置:产品 – >scheme – >编辑scheme – >运行 – >构buildconfiguration – >发布。
-
构build框架:产品 – >构build。
- 导出框架:产品 – >select框架 – >标识和types – >完整path – >发布框架。
为项目添加框架: –
-
启动一个Xcode项目并命名它(例如CocoaFrameworkTest)。
-
将sampleCocoaFramework.framework拖放到CocoaFrameworkTest的项目文件夹中。
-
目标 – >常规 – >embedded二进制 – >添加其他 – >select框架 – >复制项目,如果需要的话 – >完成。
在ViewController上访问框架: –
import UIKit import sampleCocoaFramework class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let frameworkObject = openCocoaClass.init() frameworkObject.samplePublicFunction() print(frameworkObject.samplePublicVariable) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } }
你需要在你的Objective C项目中使用与你的应用程序名称相同的公共头文件,在你的情况下,你需要添加所有你想暴露的类(这些类应该作为公共头添加到项目属性中)。一旦你做到这一点,你添加框架,并添加引用到公共标题导入FrameworkName
您可以使用以下语法将外部objC框架导入到swift项目中:
#import "objCExternalFramework-name/headerfilename.h"
按照这里的步骤:
Swift Docs
然后去这里:
YouTubevideo创build框架
请注意:
确保你设置标题的“目标成员”都是相同的(项目应该没问题)。
好的,现在是Xcode 7.2。 而我所观察到的是,快速导入区分大小写。 示例 – import uikit
不起作用。 您必须将其input为import UIKit
。
只是我的两分钱。
最新的XCode提供了将框架embedded到其他项目中的选项。 这个链接( https://stackoverflow.com/a/37328591/1084174 )适合我。
只要命令+ B会有所帮助!
原因:通过Cocoapods添加框架将创build另一个包含所需框架的pod项目。 对于识别框架的主要项目,两个项目的静态库都必须被桥接。 build立工作空间是需要的。