当前位置: 首页 > 编程笔记 >

在Objective-C和Swift之间进行细粒度的互操作

万俟超
2023-03-14
本文向大家介绍在Objective-C和Swift之间进行细粒度的互操作,包括了在Objective-C和Swift之间进行细粒度的互操作的使用技巧和注意事项,需要的朋友参考一下

示例

将API标记为时NS_REFINED_FOR_SWIFT,将其__导入Swift时将以两个下划线()作为前缀:

@interface MyClass : NSObject
- (NSInteger)indexOfObject:(id)obj NS_REFINED_FOR_SWIFT;
@end

生成的界面如下所示:

public class MyClass : NSObject {
    public func __indexOfObject(obj: AnyObject) -> Int
}

现在,您可以使用更“ Swifty”扩展名替换API。在这种情况下,我们可以使用可选的返回值,过滤掉NSNotFound:

extension MyClass {
    // 如果对象不存在,则不返回NSNotFound,
    // 此“精炼” API返回nil。"refined" API returns nil.
    func indexOfObject(obj: AnyObject) -> Int? {
        let idx = __indexOfObject(obj)
        if idx == NSNotFound { return nil }
        return idx
    }
}

// Swift代码,应使用“ if let”:"if let" as it should be:
let myobj = MyClass()
if let idx = myobj.indexOfObject(something) {
    // 用idx做某事
}

在大多数情况下,您可能想限制是否可以将Objective-C函数的参数设为nil。这可以通过使用_Nonnull关键字来完成,该关键字可以限定任何指针或块引用:

void
doStuff(const void *const _Nonnull data, void (^_Nonnull completion)())
{
    // 复杂的异步代码
}

编写该nil代码后,每当我们尝试从Swift代码传递给该函数时,编译器都会发出错误:

doStuff(
    nil,  // 错误:nil与预期的参数类型'UnsafeRawPointer'不兼容
    nil)  // error: nil is not compatible with expected argument type '() -> Void'

相反的_Nonnull是_Nullable,这表示传递nil此参数是可以接受的。_Nullable也是默认值;但是,明确指定它可以使用更多的自成体系的代码和面向未来的代码。

为了进一步帮助编译器优化代码,您可能还需要指定代码是否在转义:

void
callNow(__attribute__((noescape)) void (^_Nonnull f)())
{
    // f没有存储在任何地方
}

使用此属性,我们保证在函数完成执行后不保存块引用,也不调用该块。

 类似资料:
  • 问题内容: 在教程中,他们写到在功能上是相同的,即使闭包比阻塞更容易,并且避免了块和内存管理的复杂性,我看过很多教程,但是除了这些,我没有理解swift的“ closure”和Objective-C“块”。 问题答案: 摘录自:Apple Inc.“将Swift与Cocoa和Objective-C结合使用。” iBooks: “ Swift闭包和Objective-C块是兼容的,因此您可以将Swi

  • 问题内容: 我有一个大量的用C 编写的类库。我试图通过Swift内的某种桥接来利用它们,而不是将它们重写为Swift代码。主要动机是C 代码代表一个在多个平台上使用的核心库。实际上,我只是在创建一个基于Swift的UI,以允许核心功能在OS X下工作。 还有其他问题,“如何从Swift调用C 函数”。这 不是 我的问题。要桥接到C 函数,可以很好地进行以下操作: 通过“ C”定义桥接头 Swift

  • 问题内容: 我正在与一个以Java中的图形渲染器为目标的小组合作。我试图弄清楚以 java.awt.Graphics2D 为目标是否会向前兼容。即,其他库(例如JavaFX)是否可以显示 Graphics2D 实例的渲染? java.awt.Graphics2D 和 javafx.scene.canvas.GraphicsContext 之间是否存在互操作性? 或者,如果不是直接在 Graphic

  • 问题内容: 我正在尝试使用Restlet实现RESTful API,除了基本的角色和方法授权者之外,我发现的东西很少。我已经在数据库中存储了用户可以访问的路由和这些路由的方法。我现在遇到的问题是如何在Authorizer中获取路径。这是我需要收集的资源吗?我应该如何精确路由到授权者?我已经发布了到目前为止我正在查看的内容,如何在授权器中获取路径或资源。感谢您提供任何信息,尽管我浏览了书籍和许多通用

  • 问题内容: 我有一个这样的: 但我想将其转换为: 我怎样才能做到这一点? 问题答案: 逃避想要的角色还需要做更多的工作。 范例程式码 iOS7及以上: NSLog输出: escapedString:http%3A%2F%2Fwww 以下是有用的URL编码字符集: 创建一个结合以上所有内容的角色集: 创建一个Base64 对于Base64字符集: 对于Swift 3.0: 对于Swift 2.x:

  • 我正在开发一个程序,该程序打印来自搜索文件系统的多个线程的regex匹配,每个线程将其id添加到队列中,并通知主线程有一些线程要从线程池(std::vector)中删除。