我正在尝试使用带有Swift编程语言的Objective C框架进行iOS 8开发。这是导入的特定情况,但一般问题是:
如何将Objective C框架导入swift并获得导入识别?
我正在尝试使用iOS 8和Xcode 6测试版将Parse框架集成到一个快速的应用程序中。
以下是Objective C中Parse框架集成的技术:
https://www.parse.com/apps/quickstart#social/mobile/ios/native/existing
我已经将Parse框架下载为压缩存档,将其解压缩并将其导入Xcode 6而没有任何问题。在我的应用程序中,它显示为名为Parse.framework的格式正确的框架。
我当前的思考过程是修改项目根目录中的AppDelegate.swift
文件。这是当前没有修改的文件(在快速项目创建时由Xcode自动生成):
https://gist.github.com/fconcklin/e8ef7d8b056105a04161
我尝试通过在行import Parse
下方添加行import UIKit
来导入解析。但是,Xcode会发出警告,指出没有找到这样的模块,并且构建失败。
我还尝试使用${PROJ_NAME_HERE}-Bridging-Header.h
创建包含Parse的Objective C导入的文件import <Parse/Parse.h>
。这条线不会引发错误,但似乎最终没有任何区别。
提前致谢。 如果您需要更多信息,请告诉我。
答案 0 :(得分:70)
经过进一步的研究,我找到了解决方案并意识到我只是感到困惑。
正确的方法如下:
通过将框架拖放到Xcode 6 Swift项目中来导入Objective C框架。
在项目中创建一个新的Objective C文件(File-&gt; New-&gt; File [Objective C for iOS])。
接受提示(同意)以在Objective C和Swift之间创建桥接头文件。
删除新创建的Objective C文件,但保留桥接头文件${YOURPROJ}-Bridging-Header.h
。
在Bridging头文件中,使用标准的 Objective C 导入语法(例如#import <Parse/Parse.h>
)导入框架。
这使您无需在import Parse
文件中执行AppDelegate.swift
语句。您现在可以编写使用任何框架的代码,只要使用桥接头导入即可。它可以在整个项目的Swift文件中使用。
现在,如果您想在项目中测试Parse集成,可以键入Parse.
并使用代码完成来浏览框架,并查看代码完成是否表示导入成功。
但是,在使用桥接头文件时需要解决另一个需要注意的问题。还需要在桥接头文件中指定框架的所有依赖项。在将Parse框架集成到Swift应用程序的情况下,您的Bridging Header文件将如下所示:
#import <Foundation/Foundation.h>
// Parse Dependencies
#import <AudioToolbox/AudioToolbox.h>
#import <CFNetwork/CFNetwork.h>
#import <CoreGraphics/CoreGraphics.h>
#import <CoreLocation/CoreLocation.h>
#import <MobileCoreServices/MobileCoreServices.h>
#import <QuartzCore/QuartzCore.h>
#import <Security/Security.h>
#import <StoreKit/StoreKit.h>
#import <SystemConfiguration/SystemConfiguration.h>
// Import parse framework
#import <Parse/Parse.h>
希望这会有所帮助。
答案 1 :(得分:49)
A&#34;傻瓜证明&#34;添加桥接头的方法如下:
如果您有一个 Swift 项目,请在项目中添加一个新的 Objective-C文件,如果您想使用桥接标头配置项目,Xcode会提示。按是。
如果您有 Objective-C 项目,请向其添加新的 Swift文件,您将收到相同的提示。按是。
获得桥接标题后,您可以删除刚刚添加的文件。
答案 2 :(得分:9)
将Parse框架添加到Swift项目: 将此库添加到Swift项目中。
将这个框架从ParseSDK粘贴到您的项目中:
添加包含此类内容的ProjectName-Bridging-Header.h(https://developer.apple.com/library/ios/documentation/swift/conceptual/buildingcocoaapps/MixandMatch.html)(https://stackoverflow.com/a/24272431/1847511)文件。
添加绑定桥接标题的路径:
添加TestCode:
运行该应用。
答案 3 :(得分:2)
我的问题的答案是不同的。我的框架搜索路径在我的项目的构建设置设置为递归,当它们应该非递归时。
在我的情况下,我的目标将其框架搜索路径设置为 $(继承),这意味着从我的项目继承该设置。
我项目的框架搜索路径只有一条路径, $ PROJECT_DIR /../外部/ ** (两个星号意味着&#34;递归搜索此文件夹&#34我的 Parse.framework 文件位于External文件夹的基础级别。
为我修改从递归到非递归的路径。很奇怪......
答案 4 :(得分:1)
新的Parse框架版本需要一些更新。
例如你应该在Library Binary With Libraries中插入libsqlite3.0.dylib并用#import和#import
更新头文件答案 5 :(得分:0)
在Swift中使用Objective-C类
如果要在App Target中导入代码(在一个项目中混合Swift和Objective-C),则应使用bridging header
文件将Objective-C代码公开给Swift代码。 [在项目中混合Swift和Objective-C代码]
在这篇文章中,我将描述如何将Objective-C框架导入Swift代码
Xcode版本10.2.1
创建框架项目或创建框架目标
File -> New -> Project... -> Cocoa Touch Framework
//or
Project editor -> Add a Target -> Cocoa Touch Framework
将生成两个文件:
Info.plist
-Build Settings -> Info.plist File
<product_name>.h
-Build Phases -> Headers
。这是伞头文件[About] 将所有.h
文件添加到将向消费者开放的伞状文件
#import "header_1.h"
#import "header_2.h"
添加实施文件.m
Select `.m` file -> Select File Inspectors Tab -> Target Membership -> Select the target
//or
Project editor -> select a target -> Build Phases -> Compile Sources -> add files
添加.h
(<product_name>.h
,header_1.h
)[can not do it] [public target membership]
header_2.h
Select `.h` file -> Select File Inspectors Tab -> Target Membership -> Select the target and make it **public**
//or
Project editor -> select a target -> Build Phases -> Headers -> add files to the **public** zone
构建框架-⌘命令 + B 或Product -> Build
注意:确保为框架构建与客户端代码相同的流程体系结构。
查找生成的输出[Build location]
Products group -> <product_name>.framework -> Show in Finder
该框架包括
Info.plist
Modules
文件夹,其中:
module.modulemap
[About] [Custom modulemap]此文件是自动生成的,因为Build Settings -> Defines Module -> YES
Headers
文件夹,其中:
Headers
节中的
Drag and drop
将二进制文件放入Xcode项目[About]
Embed binaries
[Library not loaded] [Link vs Embed]
Project editor -> select a target -> General -> Embedded Binaries -> path to `<product_name>.framework` file
我将自动将框架添加到:
Project editor -> select a target -> General -> Linked Frameworks and Libraries
Project editor -> select a target -> Build Phases -> Embed Frameworks
Project editor -> select a target -> Build Phases -> Link Binary With Libraries
添加Framework Search paths
[Module not found] [Recursive path]
Project editor -> select a target -> Build Settings -> Search Paths -> Framework Search paths -> add path to the parent of `<product_name>.framework` file
将模块导入到Swift客户端代码[module_name]
import module_name