2017-03-25 186 views
2

Using Swift with Cocoa and Objective-C - Working with Cocoa Frameworks從禁用自動橋接:在某些情況下

夫特自動轉換一些Objective-C的類型夫特類型,以及一些夫特類型Objective-C的類型。

但有些情況下,自動橋接是不可取的,如性能問題或橋接實施中的錯誤。

如何在特定情況下禁用此行爲?例如。爲特定的聲明或特定的類。

+0

只有在Swift中使用Swift類型並且與Objective-C類型接口時纔會發生這種情況。例如,如果你在Swift中使用'Array'並且請求產生'NSArray'的東西,'NSArray'將會橋接到Swift'Array'。如果你直接在Swift中使用'NSArray',雖然不會發生橋接。這不包括你的用例嗎? –

+0

@ItaiFerber當我要求產生'NSArray'的東西時,我想獲得'NSArray'(跳過橋接到'Array')。 – mixel

+0

'let myArray:NSArray = thingWhichProducesNSArray()'不會橋接 –

回答

0

我希望有一個NS_DO_NOT_BRIDGE_FOR_SWIFT宏,但唉,它不存在。通過Swift的源代碼徘徊,我無法找到禁用橋接的魔術宏。以下答案是詳細的。它依賴於2個事實:

  1. 核心基礎類型(即CF*)沒有橋接到斯威夫特
  2. 有核心基金會(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運行代碼來檢查橋接是否已經發生。

相關問題