问题标签 [objective-c-swift-bridge]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
2655 浏览

objective-c - 前向声明一个 Swift 类以在 Objective-C 标头中使用它

我正在尝试将 Swift 类导入到 Objective-C 头文件中。我知道Project-Swift.h桥只能导入到实现文件(.m)中,但我有一个需要声明在 Swift 中定义的属性的 Objective-C 标头。

我在某处读到,这可以通过在头文件中前向声明类并导入Project-Swift.h到实现文件中来完成。当我这样做时,错误得到解决,但我无法访问任何类属性。

例子:

任何人都可以就如何访问 Swift 类及其属性提供建议?

0 投票
2 回答
6232 浏览

ios - 从 Objective-C 调用 Swift 类方法

我在 Swift 中有这个功能

现在我想从 Objective-C 调用那个函数。我正在做的是这样的:

但是抛出“‘ClassName’没有可见的@interface声明选择器‘someFunction:completionHandler:’

我怎样才能调用这个函数?

0 投票
1 回答
425 浏览

objective-c - 我可以防止扩展被导出到 Objective-C 的 Swift 标头吗?

我有一个带有 1 个 Swift 类的 Objective-C 项目。这个类使用的框架也是用 Swift 编写的。(使用 CocoaPods 包含框架)

我的问题是 -Swift.h 文件正在导出我的扩展,这些扩展符合框架中的协议。现在,当我尝试在 Objective-C 中导入 -Swift.h 文件时,它抱怨找不到协议定义。

我不想导出这些扩展。它们只在这个类中使用。我不能将 private 或 fileprivate 用于声明协议一致性的扩展。我还尝试在扩展声明(将警告级联到我的方法中)之前添加 @nonobjc 并且它仍然被导出。

这是我的扩展:

并生成标题:

在 Objective-C 类中包含 -Swift.h 产生的错误:

找不到“MessagingDelegate”的协议声明

找不到“MessagingNotificationDelegate”的协议声明

有没有办法防止它出现在标题中?

谢谢。

0 投票
1 回答
736 浏览

swift - 用于依赖键路径的 KVO 不适用于 Swift 类

我正在尝试用URLSessionTaskSwift 编写一个包装器。根据文档

所有任务属性都支持键值观察。

所以我想保持这种行为,并使我的包装器上的所有属性也符合 KVO(通常委托给包装的任务)并且完全可以被 Objective-C 访问。我将描述我对一个属性所做的事情,但我基本上想对所有属性做同样的事情。

让我们获取的属性stateURLSessionTask我像这样创建我的包装器:

我添加@objc了属性,以便可以从 Objective-C 调用它们。并且我添加dynamic了属性,因此即使从 Swift 也可以通过消息传递/运行时调用它们,以确保可以生成正确的 KVO 通知NSObject根据Apple 在“Using Swift with Cocoa and Objective-C”一书中的 KVO 章节,这应该足够了。

然后我实现了告诉 KVO 依赖键路径所需的静态类方法:

然后我写了一个单元测试来检查通知是否被正确调用:

当我运行它时,测试崩溃并显示NSInternalInconsistencyException

*** 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“无法从 <MyURLSessionTask 0x6000002a1440> 中删除键路径“underlyingTask.state”的观察者 <_XCKVOExpectationImplementation 0x60000009d6a0>,很可能是因为键“underlyingTask”的值已更改,但未发送适当的 KVO 通知。检查 MyURLSessionTask 类的 KVO 合规性。

但是通过设置underlyingTask-property@objcdynamic,Objective-C 运行时应该确保发送此通知,即使任务从 Swift 更改,对吗?

我可以通过手动发送底层任务的 KVO 通知来使测试正常工作,如下所示:

但我宁愿避免为每个属性都实现这个,而是更愿意使用现有的keyPathsForValuesAffecting<Key>方法。我错过了一些东西来完成这项工作吗?或者它应该工作,这是一个错误?

0 投票
0 回答
174 浏览

ios - 自动生成的 -Swift 文件无法添加框架

我正在开发一个代码在 Objective-C 和 Swift 3.2 中的项目,

我正在从需要扩展 MFMailViewControllerDelgate 的 Swift 文件发送邮件

但是当我构建项目时出现错误

在 Swift 头文件中找不到“MFMailComposeViewControllerDelegate”的协议声明

在下面的代码部分

为了解决错误,我编辑了 swift 头文件并手动添加<MessageUI/MessageUI.h> ,一切正常。但是当在项目中进行新的更改或添加新的 Swift 文件时,这个自动生成的文件会被重置并且我再次收到错误。

请提出一些永久的解决方案

仅供参考:在自动生成文件中有@import MessageUI 在构建设置中有MessageUI框架在构建设置定义模块设置为是忽略代码片段中的目标名称

0 投票
1 回答
3034 浏览

ios - 在 Swift 中使用给定的 IP 地址初始化一个 `sockaddr` 结构

Reachabilitty我在 Swift 中玩 Apple 的课程。

我的私人 Wi-Fi 中的网络服务器在http://10.0.0.1. 为了检查它的可达性,我想使用以下函数Reachability.h(不是带有主机名的函数):

sockaddr看起来socket.h像这样:

如何在 Swift 中创建sockaddr具有 ip 地址的结构?10.0.0.1

我已经读过 [这里] 一些关于UnsafePointerand的内容,UnsafeMutablePointer并且 C 数组(或者在这种情况下是一个 Objective-C 数组?)在 Swift 中表示为元组,但我仍然不确定如何使用它们。

0 投票
1 回答
409 浏览

ios - 如何将 Objective-C initWithError: 方法连接到 Swift

我在 Objective-C 中定义了一个类,它的初始化程序是-initWithError:(初始化程序可能由于对外部资源的依赖而失败)。我希望它以init() throws. 从 NSObject 继承的常规初始化程序-init,可以标记为不可用,因为我不想使用它。

在 Objective-C 中,我有:

当然,这在 Objective-C 中运行良好。

在 Swift 中,-initWithError被桥接为init(error: ()) throws. 这可能是因为withError:从方法名称中删除会导致init()与继承的普通-init初始化程序发生冲突。这可以像这样从 Swift 调用:

这看起来很奇怪,因为错误参数是无效的。如果将其导入为init() throws. 显而易见的解决方案是在 Objective-C 标头中标记-initusing 。NS_UNAVAILABLE不幸的是,这不起作用。-initWithError:仍然被桥接为init(error: ()),并且尝试调用try Foo()会导致编译器错误,指出init()在 Swift 中不可用。

有没有更优雅的解决方案,这样try init()才有效?

0 投票
1 回答
437 浏览

swift - Swift 在框架中找不到私有结构定义

我在使用 swift-bridge-header 功能访问 c 代码框架(liblinphone)时遇到问题。在 types.h 中定义的结构 LinphoneCallParams 可以在框架头文件中找到。结构定义如下

当我尝试定义参数时

在 swift 文件中,Xcode 将显示此错误通知“使用未声明的类型'LinphoneCallParams'”。(访问该文件中的其他定义没有问题,所以swift-briging-header文件没有问题) 搜索_LinphoneCallParams的定义,该定义位于未包含在SDK中的private.h中。但有趣的是,如果我使用 Object-C 代码来定义这个参数

一切正常。我不想使用 Object-C 代码来实现这个项目。知道为什么会这样吗?

0 投票
1 回答
1329 浏览

objective-c - 类名上的 @objc 注释与类本身

假设我有一个名为ExampleClass.

假设我然后编写这样的代码:

@objc class ExampleClass: NSObject {}

像这样的 ObjectiveC 文件头:

然后我在我的 React Native 应用程序中使用它,如下所示: console.log('exampleClass', React.NativeModules.ExampleClass);

现在编译react-native run-ios产生以下异常:

仅更改 swift 使其显示为:

结果编译成功。这两种语法有什么区别?为什么后者有效而前者无效?

0 投票
2 回答
1110 浏览

objective-c - React Native 中的桥接类函数

假设我有一个名为ExampleClass.

假设我然后编写这样的代码:

像这样使用 Objective-C 文件头:

然后我在我的 React Native 应用程序中使用它,如下所示:

第一个控制台日志产生{exampleFunc: f} 第二个结果undefined

调用函数:React.NativeModules.ExampleClass.exampleFunc()导致应用程序崩溃:

异常“exampleFunc 不是公认的 Objective-C 方法。” 在目标 ExampleClass 上使用参数调用 setupLogger 时抛出(

仅更改 Swift 以使其显示为:

导致调用该函数(是的)目前什么都不做。

如何公开类级别变量?我正在尝试编写函数式 Swift,并且正在使用类方法来模拟结构。