将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)中删除。