繁体   English   中英

Swift项目中导入框架,Xcode

[英]Import Framework in 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 代码库或混合语言代码库的外部框架。 无论框架是用一种语言编写的还是包含两种语言的文件,导入外部框架的过程都是相同的。 当您导入外部框架时,请确保您正在导入的框架的定义模块构建设置设置为是。

您可以使用以下语法将框架导入不同目标中的任何 Swift 文件:

SWIFT

 import FrameworkName

您可以使用以下语法将框架导入不同目标中的任何 Objective-C.m 文件:

OBJECTIVE-C

 @import FrameworkName;

我使用 Xcode 5 创建了myFramework 5 没有“定义模块”构建设置。

问题出在哪儿?

如果我正确地为您提供了框架的单独构建目标(您已经使用XCode 5构建它)并将框架包含在项目的构建目标中。

您所指的文档部分是关于不同目标中的框架。 由于您的框架位于项目的目标中,因此这部分文档不适用于此。

在您的情况下,您无法在Swift文件中导入框架。 这就是为什么你收到错误消息“没有这样的模块myFramework” myFramework不是模块 - 它是项目模块的一部分(默认情况下由您的产品名称决定)。 因此,框架中的类应该是可访问的。

但是,您的框架是用Objective-C编写的。 所以,你必须做的是所描述的进口在桥接报头中的斯威夫特面对类在这里

请注意,这与Swift导入模块无关。 bridging-header文件中的import指令只是通知编译器将Objective-C头文件“转换”为Swift语法,并使公共头文件对Swift可见。

那你现在该怎么办?

  • 首先在bridging-header中导入您感兴趣的头文件。 您只需要导入将在Swift中与之交互的标头。

  • 尝试在此阶段编译您的项目。 如果XCode找不到框架的头文件,那么你的问题可能与Swift或XCode 6无关,而是一般包含框架的问题。

  • 之后尝试实例化你在bridging-header中导入的类,可能在你的AppDelegate.swift中。 XCode自动完成应该为您提供类型名称。

希望这可以帮助。

在Swift上:

创建框架: -

  1. 启动Xcode - >创建一个新的Xcode项目 - > iOS - > Framework&Library - > Cocoa Touch Framework - >命名框架(例如sampleCocoaFramework) - > Create。

  2. 设置目标 - >常规 - >部署信息 - >部署目标。

  3. 添加公共类:文件 - >新文件 - > iOS - > Swift文件 - >命名它(例如openCocoaClass) - >创建。

  4. 现在添加一些代码到openCocoaClass.swift。

     import Foundation public class openCocoaClass { public init() { } public var samplePublicVariable = "samplePublicVariable @ openCocoaClass" public func samplePublicFunction() { print("samplePublicFunction @ openCocoaClass") } 

    }

  5. 清洁项目:产品 - >清洁

  6. 配置方案设置:产品 - >方案 - >编辑方案 - >运行 - >构建配置 - >发布。

  7. 构建框架:Product - > Build。

  8. 导出框架:Products - >选择框架 - > Identity and type - > Full Path - > Released Framework。

向项目添加框架: -

  1. 启动一个Xcode项目并命名它(例如CocoaFrameworkTest)。

  2. 将sampleCocoaFramework.framework拖放到CocoaFrameworkTest的项目文件夹中。

  3. 目标 - >常规 - >嵌入二进制 - >添加其他 - >选择框架 - >根据需要复制项目 - >完成。

访问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()
    }
}

根据Swift文档

将Objective-C代码从同一目标导入Swift

  1. 在Objective-C桥接头文件中,导入要向Swift公开的每个Objective-C头。 例如:

    #import "XYZCustomCell.h"

    #import "XYZCustomView.h"

    #import "XYZCustomViewController.h"

  2. 在Build Settings下,确保Swift Compiler - Code Generation下的Objective-C Bridging Header构建设置有一个标题路径。 路径必须直接到文件本身,而不是它所在的目录。路径应该与项目相关,类似于在Build Settings中指定Info.plist路径的方式。 在大多数情况下,您不需要修改此设置。

Swift可以看到此桥接头文件中列出的任何公共Objective-C标头。 Objective-C功能将自动在该目标内的任何Swift文件中提供,无需任何import语句。 使用与系统类相同的Swift语法使用自定义Objective-C代码。

 let myCell = XYZCustomCell() myCell.subtitle = "A custom cell" 

此外,请确保“打包”下的“定义模块”构建设置设置为“是”。

你需要在你的目标c项目中使用与你app同名的公共头文件,在你的案例FrameworkName.h中添加你想要公开的所有类(这些类应该作为项目属性中的公共头添加)一旦你这样做,您添加框架并添加对您的公共标头导入FrameworkName的引用

您可以使用以下语法将外部objC框架导入swift项目:

#import "objCExternalFramework-name/headerfilename.h"

好的,现在是Xcode 7.2。 我观察到的是,快速导入区分大小写。 示例 - import uikit不起作用。 你必须输入它作为import UIKit

只是我的两分钱。

最新的XCode提供了将框架嵌入其他项目的选项。 这个链接( https://stackoverflow.com/a/37328591/1084174 )对我来说效果很好。

Defines Module(DEFINES_MODULE) [About]生成.modulemap [About ]以使用来自 Objective-C ( @import ) 或 Swift ( import ) 的Modular Framework

[混合 Objective-C 和 Swift]使用不同的方法

same target - Bridging-Header.h
different targets - .modulemap

一步一步的例子在这里[Swift consumer -> Objective-C dynamic framework]

ommand+B就可以了!

原因:通过Cocoapods添加框架将创建另一个包含所需框架的pod项目。 对于识别框架的主项目,必须桥接两个项目的静态库。 要实现这一目标,需要构建工作空间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM