2016-11-02 67 views
2

我想擴展我在Swift中編寫的類。我想在Objective C中編寫擴展,因爲我需要將一些Objective C代碼放到Swift中。我知道我可以創建一個.h.m,然後在橋接頭上包含.h。但是在.h中,我需要包含原始的.swift類文件嗎?我可以有一個在Swift中部分實現的類,部分在Objective C中實現?

我該如何解決這個問題?我可以使用myclass-swift.h嗎?謝謝。

+0

我在Obj-C中幾乎沒有經驗,但是難道你不能只爲swift類添加一個類? – Sweeper

+0

@Sweeper問題是我需要添加的代碼是來自其他項目的複製粘貼代碼,由於與數據類型不兼容,無法將其轉換爲Swift(我需要使用指針數據類型,它不是存在於Swift中)。 –

+0

很可能,Swift類不可能有ObjectiveC類別。 –

回答

1

以下的說明文件可能會對您有所幫助:https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html#//apple_ref/doc/uid/TP40014216-CH10-ID122。你可能已經看過,但以防萬一。以下問題可能也有幫助:Extending a Swift class with Objective C category

如您所知,要在Swift中使用Objective-C代碼,需要使用橋接標頭。換一種方式,自動生成的*-Swift.h標題應該在.m(和.mm)實現文件中導入。該文件說它不應該被導入到.h文件中。實際上,編譯器不會讓您將其導入到橋接報頭中直接或間接包含的.h文件中。但是,請注意,您可以將其導入其他.h文件。

現在,假設你的Swift類被稱爲SwiftClass,並且你想添加一個在Objective-C中實現的名爲ocFunction()的方法。一種方法,在上述答案基本上呈現,就是要實現一個Objective-C的源文件(.m)類別:

@implementation SwiftClass (OCExtension) 
-(void)ocFunction {...} 
@end 

然後修改SwiftClass包括以下內容:

class SwiftClass : NSObject 
{ 
... 
    @nonobjc func ocFunction() 
    { 
     self.perform(Selector(("ocFunction"))) 
    } 
... 
} 

的參考答案建議在一個擴展中做這個,但由於你完全控制了源代碼,所以你可以直接在課堂上完成。順便說一下,Objective-C類別函數可以被命名爲SwiftClass的函數之外的其他名稱,因此不需要使用@nonobjc

的另一種方法可能是這樣定義一個Objective-C包裝接口:

@interface SwiftClassOC : NSObject 
+(void)ocFunction:(SwiftClass*)sc; 
@end 

,並將其提供給夫特經由橋接報頭。該實施將進入.m文件。然後你在SwiftClassocFunction()會是什麼樣子

func ocFunction() 
{ 
    SwiftClassOC.ocFunction(self) 
} 

請注意,SwiftClassOC是無狀態的,所以它本質上是一組採取SwiftClass指針輔助功能。 SwiftClass是維護國家的人。

+0

這實際上是一個很好的解決方案!從來沒有想過我可以執行選擇器,而選擇器可以調用該類的obj-c版本!謝謝! –

0

你可以用Swift擴展一個Objective-C類,但是你不能用Objective-C擴展一個Swift類。

我想是因爲我需要把一些目標C代碼,我不能口進入斯威夫特

你可以做到這一點寫在目標C的延伸,但並不像雨燕的一部分類。我通常做的是在Objective-C中創建一個「助手」類,並將其導入到Swift中。

相關問題