繁体   English   中英

将 Swift 框架导入到 Objective-C 项目中

[英]importing swift framework into a objective-c project

我正在将 swift 框架导入到 Objective-C 项目中,如下所示:

@import MyFramework;

问题是我正在导入框架的类只能识别一些类。

被识别的类:

public class RecognizedClass:UIViewController, WKNavigationDelegate, WKScriptMessageHandle 
 { ... } 

不是的类:

public class VeediUtils
{ ... } 

它们都是公开的,那么为什么第一个在工作区中被识别而另一个没有?

我还在头文件 MyFramework-Swift.h 中看到一个类

@interface RecognizedClass : UIViewController <WKNavigationDelegate, WKScriptMessageHandler>

出现而另一个不出现

这是为什么?

还要指出,当我将 swift 框架导入 swift 项目时,同样的程序也能工作

如果您之前将 Project 配置为与 Swift 集成并希望使用 Swift 动态框架,则必须以这种方式导入它(根据您的项目将 {value} 替换为适当的名称):

#import <{MyFramework}/{MyFrameworkMainClass}-Swift.h>  
#import "{YourProjectTargetName}-Swift.h"

编辑:

如果您的框架将Defines Module设置为true ,那么您可以像这样导入它:

@import MyFramework;

要访问 objc 中的 swift 类,该类不是从 NSObject 继承的,您需要:

@objc 公共类 VeediUtils

Swift 类或协议必须用 @objc 属性标记才能在 Objective-C 中访问和使用。 这个属性告诉编译器这段 Swift 代码可以从 Objective-C 访问。 如果您的 Swift 类是 Objective-C 类的后代,编译器会自动为您添加 @objc 属性。

https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html

您必须将@objc添加到VeediUtils类的声明中,或者使其继承自NSObject 否则,Objective-C 将看不到它。

在您的情况下, RecognizedClass被识别,因为它是UIViewController的子类,它是NSObject的子类。

在 Objective-C 中使用 Swift 类

如果您要在 App Target 中导入代码(在一个项目中混合 Objective-C 和 Swift),您应该使用下一行导入#import "<#YourProjectName#>-Swift.h"将 Swift 代码暴露给 Objective-C代码[在一个项目中混合使用 Swift 和 Objective-C 代码]

在这篇文章中,我将描述如何将 Swift 框架导入到 Objective-C 代码中

Objective-C 消费者 -> Swift 动态框架

Xcode 版本 10.2.1

创建一个 Swift 框架

按照Create Swift framework

公开 Swift API。 在 Objective-C 中使用 Swift 的函数[关于]

Objective-C 消费者

遵循Using Swift framework

将模块导入 Objective-C 客户端代码[module_name]

@import module_name;

[这里有更多例子]

在Objective-C中使用Swift类

如果要在App Target中导入代码(在一个项目中混合Objective-C和Swift),您应该使用下一个导入行#import "<#YourProjectName#>-Swift.h"将Swift代码暴露给Objective-C代码[在项目中混合使用Swift和Objective-C代码]

在这篇文章中,我将描述如何将Swift框架导入Objective-C代码

Objective-C consumer - > Swift动态框架

Xcode版本10.2.1

创建一个Swift框架

创建框架项目或创建框架目标

File -> New -> Project... -> Cocoa Touch Framework
//or
Project editor -> Add a Target -> Cocoa Touch Framework

将生成两个文件:

  1. Info.plist - Build Settings -> Info.plist File
  2. <product_name>.h - Build Phases -> Headers 它是伞头文件[关于]

添加文件.swift

Select `.swift` file -> Select File Inspectors Tab -> Target Membership -> Select the target
//or
Project editor -> select a target -> Build Phases -> Compile Sources -> add files

暴露Swift API。 使用Objective-C中的Swift函数[关于]

构建库 - ⌘命令 + BProduct -> Build

注意:确保为与客户端代码相同的流程体系结构构建框架。

查找生成的输出[构建位置]

Products group -> <product_name>.framework -> Show in Finder

该框架包括

  • Info.plist
  • Modules文件夹:
    • module.modulemap [关于] [自定义modulemap]此文件是自动生成的,因为Build Settings -> Defines Module -> YES
    • <product_name>.swiftmodule文件夹
      • .swiftdoc - docs
      • .swiftmodule - 公共接口/定义
  • Headers文件夹:
    • 来自Headers部分的文件。 有公共接口/定义
    • <product_name>-Swift.h - Xcode生成的头文件[关于]

使用Swift框架

Drag and drop二进制文件Drag and drop到Xcode项目中[关于]

Embed binaries [未加载库] [链接与嵌入]

Project editor -> select a target -> General -> Embedded Binaries -> path to `<product_name>.framework` file

我会自动将框架添加到:

  1. Project editor -> select a target -> General -> Linked Frameworks and Libraries
  2. Project editor -> select a target -> Build Phases -> Embed Frameworks
  3. Project editor -> select a target -> Build Phases -> Link Binary With Libraries

添加Framework Search paths [找不到模块] [递归路径]

Project editor -> select a target -> Build Settings -> Search Paths -> Framework Search paths -> add path to the parent of `<product_name>.framework` file

将模块导入Objective-C客户端代码[module_name]

@import module_name;

这里有更多例子

暂无
暂无

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

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