2
Using Swift with Cocoa and Objective-C - Working with Cocoa Frameworks從禁用自動橋接:在某些情況下
夫特自動轉換一些Objective-C的類型夫特類型,以及一些夫特類型Objective-C的類型。
但有些情況下,自動橋接是不可取的,如性能問題或橋接實施中的錯誤。
如何在特定情況下禁用此行爲?例如。爲特定的聲明或特定的類。
Using Swift with Cocoa and Objective-C - Working with Cocoa Frameworks從禁用自動橋接:在某些情況下
夫特自動轉換一些Objective-C的類型夫特類型,以及一些夫特類型Objective-C的類型。
但有些情況下,自動橋接是不可取的,如性能問題或橋接實施中的錯誤。
如何在特定情況下禁用此行爲?例如。爲特定的聲明或特定的類。
我希望有一個NS_DO_NOT_BRIDGE_FOR_SWIFT
宏,但唉,它不存在。通過Swift的源代碼徘徊,我無法找到禁用橋接的魔術宏。以下答案是詳細的。它依賴於2個事實:
CF*
)沒有橋接到斯威夫特CF*
)可可(NS*
)類型的免費橋接和我們來看一個例子。首先,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
好處是一切都記錄在案,因此 「官方」。您可以通過Profiler運行代碼來檢查橋接是否已經發生。
只有在Swift中使用Swift類型並且與Objective-C類型接口時纔會發生這種情況。例如,如果你在Swift中使用'Array'並且請求產生'NSArray'的東西,'NSArray'將會橋接到Swift'Array'。如果你直接在Swift中使用'NSArray',雖然不會發生橋接。這不包括你的用例嗎? –
@ItaiFerber當我要求產生'NSArray'的東西時,我想獲得'NSArray'(跳過橋接到'Array')。 – mixel
'let myArray:NSArray = thingWhichProducesNSArray()'不會橋接 –