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 的源代码,我找不到那个禁用桥接的神奇宏。下面的答案很冗长。它依赖于两个事实:
- 核心基础类型(即
CF*
) 没有桥接到 Swift
- 核心基金会 (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(使用前将#替换为@)