在某些情况下禁用自动桥接

2024-03-17

From 将 Swift 与 Cocoa 和 Objective-C 结合使用 - 使用 Cocoa 框架 https://developer.apple.com/library/prerelease/content/documentation/Swift/Conceptual/BuildingCocoaApps/WorkingWithCocoaDataTypes.html:

Swift 自动将一些 Objective-C 类型转换为 Swift 类型,以及一些 Swift 类型转换为 Objective-C 类型。

但在某些情况下,自动桥接是不受欢迎的,例如性能问题或由于桥接实现中的错误。

在特定情况下如何禁用此行为?例如。对于特定的语句或特定的类。


我希望有一个NS_DO_NOT_BRIDGE_FOR_SWIFT宏,但遗憾的是,它不存在。浏览 Swift 的源代码,我找不到那个禁用桥接的神奇宏。下面的答案很冗长。它依赖于两个事实:

  1. 核心基础类型(即CF*) 没有桥接到 Swift
  2. 核心基金会 (Core Foundation) 之间有免费的桥接服务 (CF*)和可可(NS*) types

让我们看一个例子。首先,Objective-C 方面:

// MyClass.h
@interface MyClass : NSObject

NS_ASSUME_NONNULL_BEGIN
- (NSArray *)  randomNumbers NS_SWIFT_UNAVAILABLE("");  // mark this method as unavailable in Swift
- (CFArrayRef) cfRandomNumbers NS_REFINED_FOR_SWIFT;    // tell the compiler that you have a refined version for Swift
NS_ASSUME_NONNULL_END

@end

// MyClass.m
#import "MyClass.h"

@implementation MyClass

- (NSArray *) randomNumbers {
    return @[ @1, @2, @3 ];
}

- (CFArrayRef) cfRandomNumbers {
    return CFBridgingRetain([self randomNumbers]);  // toll-free
}

@end

斯威夫特方面

extension MyClass {
    // Even though we marked `randomNumbers` as unavailable in Swift, we can't
    // use the same signature. Must name it something else.
    func objcRandomNumbers() -> NSArray {
        // Methods marked with NS_REFINED_FOR_SWIFT pick up
        // double-underscore prefix in their names
        return __cfRandomNumbers().takeUnretainedValue() as NSArray
    }
}

let obj = MyClass()
let arr = obj.objcRandomNumbers() // no bridging here

好处是一切都有记录,因此是“官方的”。您可以通过分析器运行代码来检查桥接是否发生。

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

在某些情况下禁用自动桥接 的相关文章

  • 玻璃效果 UIView

    我想知道如何在 UIView 上添加玻璃效果 我想像这样的效果 http pttrns com pickers detail 0dc9d9f6c6a7577613b3453768eee3b3在灰色半透明视图上 您 可以在这里看到 Thank
  • 如何检测Retina高清显示屏?

    UIScreen有一个新的 nativeScaleiOS 8 中的属性 但文档没有提及它 property nonatomic readonly CGFloat nativeScale 还有一个scale属性 但文档说它是 2 用于视网膜显
  • 我们可以从 LinkPresentation 框架中的 LPLinkView 中提取图像吗?

    我想在我的应用程序中呈现丰富的链接 并将这些数据发送到我的服务器 我需要访问视图内的图像LPLinkView https developer apple com documentation linkpresentation lplinkvi
  • 在另一种语言中使用 dateFormatter [重复]

    这个问题在这里已经有答案了 我正在运行一段返回的代码nil在具有不同语言设置的 iPhone 上运行时 代码示例如下所示 let dateFormatter DateFormatter dateFormatter dateFormat MM
  • Swift 3.0 Pin 颜色注释在 MapView 中没有改变

    我有兴趣根据案例场景更改注释的图钉颜色 在一个函数中 我发送了一个数组 用于确定引脚注释的颜色 到目前为止 我已经设置了一个名为 ColorPointAnnotation 的子类 它将确定 pinColor 然后 在 switch 语句中
  • UISearchController 保留问题

    我正在尝试使用 UISearchController 但是我遇到了无法解决的保留问题 MainTableview 有两个部分 第1节 基于某些正则表达式过滤数据 第2节 All Data 我将 UISearchController 添加到我
  • Swift 中具有透明背景的按钮边框

    我怎样才能做一个UIButton边框看起来像下图 入门 按钮一样具有透明背景吗 我应该如何使用情节提要来实现这一点 或者如何以编程方式实现这一点 设置backgroundColor to clearColor使按钮透明 例如尝试下面的代码
  • 使用 Storyboard 时获取 NSManagedObjectContext

    目标是获取当前的 NSManagedObjectContext 以便使用 Core Data 在 iOS 4 3 中 我将 UINavigationController 的委托设置为 AppDelegate 如下所示 在 AppDelega
  • xcode 6.1 (Swift) 中的 SIGABRT 运行时错误

    与最初的代码相比 唯一的更改是在ViewControl swift override func viewDidLoad newMessage hidden true super viewDidLoad Do any additional s
  • 退出导航控制器

    我试图离开初始视图控制器 并进入空白视图控制器 这很好 但是这会使空白视图控制器也成为导航控制器的一部分 这不是我想要的 我想脱离视图控制器 在视图控制器中 我尝试退出 它会自行弹出 当我尝试视图中的方法时 将出现目标视图控制器 self
  • 在 UIMenuItem 上设置accessibilityLabel

    我正在尝试设置accessibilityLabel of a UIMenuItem而且似乎没有效果 无论如何 VoiceOver 只是读取项目的标题 let foo UIMenuItem title foo action selector
  • UITabBarController 未选择的图标图像色调

    我有一个 UITabBarController 我正在尝试修改 现在 未选择的选项卡图标图像默认为灰色 我知道您无法以编程方式更改这些未选择的图标图像的色调 苹果表示 色调是由 png 文件本身的实际色调控制的 因此 如果您想要白色或绿色图
  • Ios Swift制作字体切换粗体、斜体、boldItalic、正常而不改变其他属性

    我很惊讶 在 Swift 中简单地为现有字体设置粗体和斜体是如此复杂 我只是想通过在字体类上使用以下方法来简化事情 我希望将以下方法添加到已设置字体系列和字体大小的现有字体中 我需要保留这些并仅更改以下内容 setBold Shud 保留斜
  • iOS 以编程方式将 AVI 转换为 MP4 格式

    我的应用程序中有一个查询 因为我想将 AVI 格式的视频转换为 MP4 电影格式 所以有没有什么方法可以以编程方式执行此操作 任何代码片段将不胜感激 你需要使用AVAssetExportSession将视频转换为 mp4格式 下面方法转换
  • Firestore 读取包含子集合的文档的计费

    我正在制作一个应用程序 它存储用户使用我的应用程序学习了多少分钟 我的 Firestore 数据库以 用户 集合开始 每个用户都有自己的文档 该文档由其在 Auth 中生成的 userID 命名 我的问题是 如果我读取了他们的 userID
  • 删除 UINavigationBar 下的 1px 边框 - 不起作用

    IBOutlet var navBar UINavigationBar self navBar setBackgroundImage UIImage forBarMetrics UIBarMetrics Default self navBa
  • 在 macOS 上通过 Apache 本地运行 Xcode DocC 文档

    Xcode 13 的 DocC 文档档案可以使用自定义 Apache 托管 htaccess文件中描述的向外部开发人员分发文档 https developer apple com documentation xcode distributi
  • 我在 NSDateComponentsFormatter 上的 allowedFractionalUnits 上做错了什么?

    基本上我想要的是获取仅以小时表示的时间间隔的值 而不将其四舍五入为完整小时 使用NSDateComponentFormatter https developer apple com library ios documentation Fou
  • WKWebView:无需 Javascript 即可缩放PageToFit 行为

    如何获得scalesPageToFit显示在 HTML 内容中的行为WKWebView 不使用 JavaScript 在我们的例子中需要禁用 JS 抱歉没有发布任何代码 但我不知道如何实现这一目标 我所知道的和我找到的所有解决方案都是基于J
  • 如何在 UITableViewCell 上使用自定义初始值设定项?

    我有一个自定义 UITableViewCell 我想在我的表视图中使用它 这是我的单元格代码 class ReflectionCell UITableViewCell IBOutlet weak var header UILabel IBO

随机推荐

  • Json字符串化范围错误

    我从 API 得到的结果如下 id 1 area zone T aisle side E col 1 level 0 position 0 name T E 1 id 2 area zone T aisle side E col 60 le
  • Objective C UITableView - 更改单元格高度后表格单元格显示错误的内容

    我正在尝试在 xcode 中构建一个应用程序 它除了其他应用程序之外还读取 rss 提要并显示帖子 我是 Objective C 的新手 有时发现它有点困难 我使用 NSMutableArray 来获取检索到的故事 帖子 每个故事都由一个
  • 使用 RVM 安装 Ruby 2.1.3 时出错

    我正在尝试使用 RVM 安装 Ruby 2 1 3 我安装了最新版本的 XCode 并且全新安装了 rvm 我基本上在做 rvm autolibs brew rvm install ruby 2 1 3 一切看起来都工作正常 但随后我收到此
  • CGContext 文本绘制在 iPhone 4 上无法按比例放大

    我正在尝试创建一个可以在 iPhone 4 上很好地缩放的应用程序 目前 它的大部分都可以完美缩放 除了一个关键部分 我在 CALayer 中的 drawInContext 方法内绘制的文本 这是我的代码 void drawInContex
  • 挂钩事件 Outlook VSTO 在主线程上继续工作

    我开发了一个 Outlook VSTO 插件 有些任务应该在后台线程上完成 通常 检查本地数据库中的某些内容或调用网络请求 阅读了几篇文章后 我放弃了在后台线程中调用 Outlook 对象模型 OOM 的想法 我有一些 wpf 控件 并且我
  • 在 django-rest-framework 中创建一个带有关系的rest api

    在 django rest framework 中创建一个rest api 我有2张桌子 拳头表 用户 id PK Name varchar 255 第二个表 地址 id PK address varchar 255 city id int
  • 如何将多个 UIBarButtonItem 添加到 UINavigationBar?

    我想添加很多UIBarButtonItem s to a UINavigationbar 不仅仅是左右按钮 logoButton UIBarButtonItem alloc initWithTitle A Button style UIBa
  • WP7 - 防止 RestSharp 缓存

    我在 Windows Phone 7 1 项目中使用 RestSharp 我的问题是 RestSharp 总是缓存响应数据 Example 我第一次发送请求时 它正确返回数据 经过一些删除操作后 我再次发送该请求 但响应似乎与第一次相同 没
  • 从结账后挂钩中检索分支名称

    当在 Git 中从一个分支切换到另一个分支时 是否有任何方法可以从 post checkout 挂钩中检索两个分支的名称 所以假设我要运行以下两个命令 git branch branch a branch b master git chec
  • 以递归函数的形式返回

    我想了解如何在 C 中使用递归 但我不明白如何return在其中工作 请考虑以下代码 int recur int i printf recur i d n i if i lt 3 recur i 1 return 10 else if i
  • SHA512 哈希值在 android、php 和 javascript 上有所不同

    我正在使用 SHA512 哈希在我的应用程序与其后端之间传输一些加密数据 然而 我遇到了一个奇怪的情况 不知道是什么原因造成的 因此 我测试了以下设置 安卓 2x SHA512 Android 1x SHA512 gt CryptoJS 1
  • Snackbar 和其他动画在某些 Android 设备上停止工作

    我有一个非常奇怪的问题 我无法弄清楚 直到最近我才成为一个问题 但我似乎无法恢复以防止它 另一个奇怪的事情是它可以在某些设备上运行 而在其他设备上则不能 问题是动画 其中一个特别是小吃店 小吃栏应该上下动画 但事实并非如此 它只是显示然后隐
  • 如何在haskell中将函数类型序列化为json?

    data Task Task id String description String dependsOn String dependentTasks String deriving Eq Show Generic ToJSON FromJ
  • Django Rest框架具有多个模型的嵌套字段

    这是 django 和 django Rest 框架 我有 2 个模型 用户和电话 第一个问题 我希望能够与电话一起更新用户数据 电子邮件 1 个 API 更新响应中的数据 电话号码 电话号码可以 为 0 个或多个 嗯 实际上就像parti
  • 如何更新媒体商店中的流派?

    我正在尝试更新音频文件的流派标签 CODE final Uri genreUri MediaStore Audio Genres EXTERNAL CONTENT URI String currentGenreName MediaStore
  • R:整数与数字

    这个问题也许之前已经得到了回答 但我没有看到答案 我有一个由数字和缺失值组成的数据集 一行是一个百分比 下面是一小组假数据 其中 AA BB 和 CC 是列名称 该数据集中的第三行是百分比 AA BB CC 234 432 78 1980
  • jssor滑块宽度问题

    超级困惑如何调整这个滑块的宽度 我尝试编辑jquery 你会看到它被注释掉了 jQuery document ready function var nestedSliders each sliderh1 container sliderh2
  • 使用空手道框架生成单个 cucumber.json

    我在空手道测试中使用并行执行 我试图在里面生成一个 cucumber json 文件target文件夹 在当前设置下 surefire reports 文件夹中有不同的 json 和 xml 文件 有没有办法可以生成包含功能结果的单个 js
  • 如何在SQL中选择没有时间的日期

    当我在 SQL 中选择日期时 它返回为2011 02 25 21 17 33 933 但我只需要日期部分 即2011 02 25 我怎样才能做到这一点 对于 SQL Server 2008 Convert date getdate 请参阅h
  • 在某些情况下禁用自动桥接

    From 将 Swift 与 Cocoa 和 Objective C 结合使用 使用 Cocoa 框架 https developer apple com library prerelease content documentation S