混合语言框架

2024-02-01

我有一个用 Objective-C 编写的框架(我们称之为 MyKit),我用一些 Swift 类对其进行了扩展。我正在尝试使用以下文档来理解它:https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html#//apple_ref/doc/uid/TP40014216-CH10-XID_77 https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html#//apple_ref/doc/uid/TP40014216-CH10-XID_77

据我了解,我不应该有桥接头类,而是将所有包含内容放在伞头文件中(我理解是)。

所以我在MyKit.h中写道:

#import <MyKit/ModelObjectA.h>
#import <MyKit/ModelObjectB.h>
#import <MyKit/ControllerObjectC.h>

我没有列出 ControllerObjectD.swift,即使它也进入这里?或者我应该包括

#import <MyKit/ControllerObjectD-Swift.h>

?

ControllerObjectD 使用 ModelObjectA 和 ModelObjectB。现在我没有桥头文件,我会收到编译错误,因为它找不到这些对象。

该文档称“Swift 将看到您在伞标头中公开公开的每个标头。”当我将框架导入其他项目时,情况确实如此,但框架项目无法编译,因为它看不到它。我已打开“定义模块”构建设置。

也许我对伞头有什么误解?我在哪里可以说“嗨项目,这是伞头文件”?如果我将伞头文件设置为桥接头文件,框架就会编译,但这听起来像是我以这种方式回到了起点?

Cheers

Nik


我相信您的问题可能在于 Swift 类中的访问修饰符,但是我编写了一个简短的指南和示例项目来帮助您:

可以找到示例项目here https://github.com/elliott-minns/SwiftObjCTestFramework

混合语言框架分为两个部分:

  1. 将 Objective-C 导入 Swift
  2. 将 Swift 导入 Objective-C

1. 将 Objective-C 导入 Swift

例如,如果您有一个名为的 Objective-C 类Player您想要添加到一个名为的 swift 类中Game.

根据文档,您需要执行以下两个步骤来导入Player对象进入Game object.

  1. 在“构建设置”下的“打包”中,确保该框架目标的“定义模块”设置设置为“是”。
  1. 在您的头文件中,导入您想要向 Swift 公开的每个 Objective-C 头文件。

    #import <Framework/Player.h>
    

确保您的PlayerObjective-C 中的头文件被标记为框架中的公共目标成员身份:

按照以下步骤,可以导入PlayerObjective-C类进Game斯威夫特类:

import UIKit

public class Game: NSObject {
    public let player: Player

    public init(player: Player) {
        self.player = player
        super.init();
    }
} 

2. 将 Swift 导入 Objective-C

用于导入 SwiftGame类进入Player对象,我们可以遵循类似的过程。

  1. 像之前一样;在“构建设置”下的“打包”中,确保该框架目标的“定义模块”设置设置为“是”。
  1. 使用以下语法并替换适当的名称,将 Swift 代码从该框架目标导入到该框架目标内的任何 Objective-C .m 文件中:

    #import <ProductName/ProductModuleName-Swift.h>
    

    就我而言,其工作原理如下:

    #import <SwiftObjC/SwiftObjC-Swift.h>
    

    我假设,对你来说:

    #import <MyKit/MyKit-Swift.h>
    

    因此,请确保您要访问的所有属性、方法和类在您的 swift 文件中定义为 public,否则它们对 Objective-C 不可见。

我已经在 GitHub 上上传了示例项目,展示了这一切是如何工作的https://github.com/elliott-minns/SwiftObjCTestFramework https://github.com/elliott-minns/SwiftObjCTestFramework

我希望这可以帮助您解决您的问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

混合语言框架 的相关文章

  • 我无法捕获 WKWebView 的屏幕截图

    我正在尝试捕获 WKWebView 的屏幕截图 但我的方法无法正常工作 它返回纯色 就好像图层树为空一样 而它似乎适用于其他视图 UIImage screenshot UIImage screenshot UIGraphicsBeginIm
  • UIViewController 作为单例

    我在标签栏应用程序中有一个 UIViewController 我已经从 MainWindow nib 文件添加了控制器 即不是以编程方式 我的问题是如何使我的视图控制器成为单例 解决 Facebook 委托问题 您可能想让您的 Facebo
  • 如何比 CGContextStrokePath 更快地渲染线条?

    我正在使用 CGContextStrokePath 绘制约 768 个点的图表 问题是 每一秒我都会得到一个新的数据点 从而重新绘制图表 目前 这个已经很繁忙的应用程序占用了 50 的 CPU 图形绘制是在UIView 中的drawRect
  • Xcode 9.0.1 应用程序分发程序已更改

    最近我将 Xcode 升级到了 Xcode 9 1 之后 当我尝试发布我的应用程序时 Xcode 不允许选择我为临时创建的分发配置文件 这么说 配置文件不是 IOS 应用商店配置文件 如果 Xcode 9 1 的应用程序分发过程有变化 请告
  • 检测 UITableView 中的水平平移

    我正在使用 UIPanGestureRecognizer 来识别 UITableView 中的水平滑动 准确地说是在单元格上 尽管它已添加到表格本身 然而 这个手势识别器显然窃取了桌子上的触摸 我已经让 pangesturerecogniz
  • Expo 应用程序“您的应用程序正在使用广告标识符 (IDFA)”

    我正在尝试将应用程序上传到应用程序商店 每次我上传二进制文件时 苹果都会坚持认为我的应用程序正在使用广告 而我从未实现过这样的事情 我查看了文档并删除了涉及的所有代码ASIdentifier and adIdentifier我不太确定我错过
  • ObjC <-> Swift 桥接和工厂方法

    我想从 Swift 使用一些 Objective C 类 由于超出了这个问题范围的原因 我的班级init方法被标记为不可用 相反 有一个工厂方法 这是我的班级的简化形式 interface MyClass NSObject instance
  • 是否可以使用 iOS SDK 更改 Amazon Cognito 中的用户名?

    正如标题中所写 是否可以更改 Amazon Cognito 用户的用户名 我在文档中找不到任何内容 可以更新preferred username使用 iOS SDK 的 Cognito 用户 使用updateAttributesAPI 调用
  • UIWebView 未正确加载 JavaScript - 嵌入式 Facebook 帖子

    Facebook 有一项新功能 允许用户将公共帖子嵌入网页中 我想尝试在 UIWebView 内的 iPhone 应用程序中使用它 转义必要的代码非常简单 但即使我手动转义代码 Web 视图也不会正确加载帖子 JavaScript 根本不起
  • 使用原始类型+大小写参数的 Swift Enum 的解决方法?

    我想创建 SKSpriteNodesWallType 请参阅下面的代码 并且仅当WallType is Corner通过它Side其方向的价值 枚举具有原始值 因为我需要将它们作为数字从 plist 加载 并能够随机创建它们 enum Si
  • UIWebView 如何检测 被点击

    我知道下面的方法可以检测链接元素点击 但我想知道是否UIView可以检测是否img元素被点击 BOOL webView UIWebView webView shouldStartLoadWithRequest NSURLRequest re
  • 除了使用正则表达式之外,在 Swift 中解析 HTML

    下面是我想在 Swift 中解析的 HTML 代码 td class pinyin a href rsc audio voice pinyin pz yi1 mp3 span class mpt1 y span a a href rsc a
  • 在 swift 中设置状态栏的自定义颜色?

    在视图控制器上 我想将状态栏的颜色设置为黑色 但我无法更改它 我为此目的使用下面的代码 func setUpUI self navigationController setNavigationBarHidden true animated
  • 监控剪贴板活动可可?

    是否可以在可可中 观看 用户剪贴板 例如 如果我的应用程序是系统托盘样式应用程序 例如 dropbox 客户端 我可以订阅用户在另一个应用程序中点击复制 粘贴时引发的事件吗 你可以随时查看Apple的示例代码 剪贴板查看器 http dev
  • Xcode UI 测试 - 通过 id 在 Webview 中查找元素

    我们的应用程序是混合的 包含 webview 我正在尝试使用 Xcode UI 测试自动化我们的应用程序 我能够使用以下方法找到网络按钮 let app XCUIApplication app launch let button app s
  • 如何确定 UINavigationController 中工具栏的高度?

    我有一个带有由 UINavigationController 呈现的工具栏的视图 当我处理 UIKeyboardWillShowNotification 时 我将整个屏幕向上滚动键盘的高度 问题是当显示键盘时 底部工具栏不显示 所以我只需将
  • swift 3.0 中的 Sha 256 加密语法错误

    func SHA256 gt String let data self data using String Encoding utf8 let res NSMutableData length Int CC SHA256 DIGEST LE
  • iPhone 上的锁定方向 UIWebView

    有没有办法锁定 UIWebView 的方向 使用 Obj C JS 还是 Html 我不想有按钮或任何东西 我只想在应用程序打开时将其锁定为纵向 好像这个堆栈溢出帖子 https stackoverflow com questions 43
  • 使用排序函数按 NSDates 对数组进行排序[重复]

    这个问题在这里已经有答案了 我有一个名为的模型类Event import Foundation import MapKit public class Event let id Int var title String let status
  • NSUserDefaults、Settings.bundle 和应用程序组

    我有一个有 2 个目标的应用程序 主应用程序和 Today 扩展 为了在这些目标之间共享设置 我打开了应用程序组功能 添加了一个组group myApp com然后使用NSUserDefaults在主应用程序和今日扩展中都是如此 var d

随机推荐

  • 当应用程序在后台时广播接收器

    我正在尝试编写一个应用程序 其中我根据使用 gcm 推送通知发送的消息对 UI 进行更改 并且我设法通过使用 BroadcastReceiver onReceive 函数来实现它 但它仅在应用程序位于前台时才有效 但如果它在后台或关闭 没有
  • decltype(void()) 中的 void() 是表达式还是函数类型?

    这是后续的this https stackoverflow com questions 39278200 is sizeofvoid a legal expression问题 更准确地说是评论this https stackoverflow
  • Spring Boot 2.0.0 + OAuth2

    Spring Boot 2 Spring Security OAuth2 是否仍然支持 AuthorizationServer注解 通过阅读发行说明 有些内容尚未移植 Oauth2 支持 https github com spring pr
  • 是否可以使用可靠的仅 javascript 上传文件

    我想要一种可靠的方式来上传文件 这意味着我希望能够处理中断 错误和暂停 所以我的问题是 是否可以仅在客户端上使用 javascript 进行类似以下操作 如果是这样 我想要指向库 教程 书籍或实现的指针 如果不是 我想解释为什么这是不可能的
  • 这段代码是线程安全的吗?

    我想处理客户请求流 每个请求都有其特殊类型 首先 我需要初始化该类型的一些数据 然后我可以开始处理请求 当客户端类型第一次来的时候 我只是初始化相应的数据 此后 将使用该数据处理该类型的所有后续请求 我需要以线程安全的方式执行此操作 这是我
  • 使用 AsyncController 处理超时的最佳方法

    我的 MVC3 项目中有一个很长时间的轮询控制器 它的超时设置为 30 秒 我有一个 HandleErrorAttribute 实现来处理所有错误的日志记录 由于超时会抛出 TimeoutException 这意味着日志中将会出现该异常 我
  • React-Native 应用程序特定于平台的 ios/android 打字稿文件的相对导入

    我有一个基于 React Native 平台有 2 种不同设计的组件 MyComponent ios tsx and MyComponent android tsx 虽然当我将组件导入MyView tsx 它抱怨 MyView tsx 5
  • 如何在 Eclipse 中调试来自 Maven 构建的测试?

    如何启动 Maven 构建并让测试出现在 Eclipse 的调试透视图中 包或安装是一个原子操作 实际上不应该停止调试 除非您正在调试 Maven 插件 不过 您应该能够通过选择 Eclipse 项目并执行 调试为 gt JUnit 测试
  • 如何单击 python-capmonster 中的确认按钮

    每个人 你好吗 现在我正在制作脚本来解决验证码问题 使用 python capmonster 模块 我可以获得响应 所以我输入了响应
  • 如何消除条形图中条形之间的间隙

    我正在 Matplotlib 中通过如下调用制作条形图 xs bar bar lefts bar heights facecolor black edgecolor black 我得到一个如下所示的条形图 我想要的是连续条之间没有白色间隙的
  • 当我按回车键或在文本字段外部单击时,如何删除文本字段焦点? (SwiftUI、MacOS)

    当我按回车键或在文本字段外部单击时 如何删除文本字段焦点 请注意 这是 SwiftUIMacOS 如果我这样做 import SwiftUI struct ContentView View State var field1 String T
  • Hive:选择 AS 和分组依据

    我有一个 Hive 查询 例如 SELECT Year Month Day Hours Minutes cast cast Seconds as int 15 as int 15 AS secondMod Count AS PerCount
  • XMLHttpRequest 返回错误编码的字符

    我使用 XMLHttpRequest 来读取 PDF 文档http www virtualmechanics com support tutorials spinner Simple2 pdf http www virtualmechani
  • 无法执行目标 org.apache.maven.plugins:maven-clean-plugin:2.4.1

    我正在做一个maven项目 我的IDE是Eclipse 我无法掌握的是当我在Eclipse中使用 clean X 时 它会报告以下错误 Apache Maven 3 0 4 r1232337 2012 01 17 16 44 56 0800
  • 将 Emacs AUCTeX 与 Sumatra PDF 同步

    有了我的这些行init el我能够将 Emacs LaTeX 缓冲区与 Sumatra 同步 setq TeX source correlate mode t setq TeX source correlate method synctex
  • 为什么我会出现 Keras 形状不匹配的情况?

    我正在遵循一个针对初学者的 Keras mnist 示例 我尝试更改标签以适合我自己的数据 该数据有 3 个不同的文本分类 我正在使用 to categorical 来实现这一点 形状对我来说看起来不错 但 fit 会出现错误 train
  • 查找数组中长度为 k 的所有子集

    给定一组 1 2 3 4 5 n 对于 n 个元素 我们需要找到长度为 k 的所有子集 例如 如果 n 4 且 k 2 则output将会 1 2 1 3 1 4 2 3 2 4 3 4 我什至不知道如何开始 我们不必使用内置的库函数 如
  • 你怎么会忘记 Laravel 中缓存的 Eloquent 模型呢?

    关于 Laravel 的理论问题在这里 所以我要做的缓存示例是 Article with comments gt remember 5 gt get 理想情况下 我希望有一个文章更新事件 当该模型的实例 已缓存 的 ID 更新时 我想忘记该
  • 存在哪些 ASP.NET MVC 示例项目? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 混合语言框架

    我有一个用 Objective C 编写的框架 我们称之为 MyKit 我用一些 Swift 类对其进行了扩展 我正在尝试使用以下文档来理解它 https developer apple com library ios documentat