问题标签 [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.
objective-c - 前向声明一个 Swift 类以在 Objective-C 标头中使用它
我正在尝试将 Swift 类导入到 Objective-C 头文件中。我知道Project-Swift.h
桥只能导入到实现文件(.m)中,但我有一个需要声明在 Swift 中定义的属性的 Objective-C 标头。
我在某处读到,这可以通过在头文件中前向声明类并导入Project-Swift.h
到实现文件中来完成。当我这样做时,错误得到解决,但我无法访问任何类属性。
例子:
任何人都可以就如何访问 Swift 类及其属性提供建议?
ios - 从 Objective-C 调用 Swift 类方法
我在 Swift 中有这个功能
现在我想从 Objective-C 调用那个函数。我正在做的是这样的:
但是抛出“‘ClassName’没有可见的@interface声明选择器‘someFunction:completionHandler:’
我怎样才能调用这个函数?
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”的协议声明
有没有办法防止它出现在标题中?
谢谢。
swift - 用于依赖键路径的 KVO 不适用于 Swift 类
我正在尝试用URLSessionTask
Swift 编写一个包装器。根据文档
所有任务属性都支持键值观察。
所以我想保持这种行为,并使我的包装器上的所有属性也符合 KVO(通常委托给包装的任务)并且完全可以被 Objective-C 访问。我将描述我对一个属性所做的事情,但我基本上想对所有属性做同样的事情。
让我们获取的属性state
。URLSessionTask
我像这样创建我的包装器:
我添加@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@objc
和dynamic
,Objective-C 运行时应该确保发送此通知,即使任务从 Swift 更改,对吗?
我可以通过手动发送底层任务的 KVO 通知来使测试正常工作,如下所示:
但我宁愿避免为每个属性都实现这个,而是更愿意使用现有的keyPathsForValuesAffecting<Key>
方法。我错过了一些东西来完成这项工作吗?或者它应该工作,这是一个错误?
ios - 自动生成的 -Swift 文件无法添加框架
我正在开发一个代码在 Objective-C 和 Swift 3.2 中的项目,
我正在从需要扩展 MFMailViewControllerDelgate 的 Swift 文件发送邮件
但是当我构建项目时出现错误
在 Swift 头文件中找不到“MFMailComposeViewControllerDelegate”的协议声明
在下面的代码部分
为了解决错误,我编辑了 swift 头文件并手动添加<MessageUI/MessageUI.h>
,一切正常。但是当在项目中进行新的更改或添加新的 Swift 文件时,这个自动生成的文件会被重置并且我再次收到错误。
请提出一些永久的解决方案
仅供参考:在自动生成文件中有@import MessageUI
在构建设置中有MessageUI
框架在构建设置定义模块设置为是忽略代码片段中的目标名称
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
我已经读过 [这里] 一些关于UnsafePointer
and的内容,UnsafeMutablePointer
并且 C 数组(或者在这种情况下是一个 Objective-C 数组?)在 Swift 中表示为元组,但我仍然不确定如何使用它们。
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 标头中标记-init
using 。NS_UNAVAILABLE
不幸的是,这不起作用。-initWithError:
仍然被桥接为init(error: ())
,并且尝试调用try Foo()
会导致编译器错误,指出init()
在 Swift 中不可用。
有没有更优雅的解决方案,这样try init()
才有效?
swift - Swift 在框架中找不到私有结构定义
我在使用 swift-bridge-header 功能访问 c 代码框架(liblinphone)时遇到问题。在 types.h 中定义的结构 LinphoneCallParams 可以在框架头文件中找到。结构定义如下
当我尝试定义参数时
在 swift 文件中,Xcode 将显示此错误通知“使用未声明的类型'LinphoneCallParams'”。(访问该文件中的其他定义没有问题,所以swift-briging-header文件没有问题) 搜索_LinphoneCallParams的定义,该定义位于未包含在SDK中的private.h中。但有趣的是,如果我使用 Object-C 代码来定义这个参数
一切正常。我不想使用 Object-C 代码来实现这个项目。知道为什么会这样吗?
objective-c - 类名上的 @objc 注释与类本身
假设我有一个名为ExampleClass
.
假设我然后编写这样的代码:
@objc class ExampleClass: NSObject {}
像这样的 ObjectiveC 文件头:
然后我在我的 React Native 应用程序中使用它,如下所示:
console.log('exampleClass', React.NativeModules.ExampleClass);
现在编译react-native run-ios
产生以下异常:
仅更改 swift 使其显示为:
结果编译成功。这两种语法有什么区别?为什么后者有效而前者无效?
objective-c - React Native 中的桥接类函数
假设我有一个名为ExampleClass
.
假设我然后编写这样的代码:
像这样使用 Objective-C 文件头:
然后我在我的 React Native 应用程序中使用它,如下所示:
第一个控制台日志产生{exampleFunc: f}
第二个结果undefined
,
调用函数:React.NativeModules.ExampleClass.exampleFunc()
导致应用程序崩溃:
异常“exampleFunc 不是公认的 Objective-C 方法。” 在目标 ExampleClass 上使用参数调用 setupLogger 时抛出(
仅更改 Swift 以使其显示为:
导致调用该函数(是的)目前什么都不做。
如何公开类级别变量?我正在尝试编写函数式 Swift,并且正在使用类方法来模拟结构。