我想擴展我在Swift中編寫的類。我想在Objective C中編寫擴展,因爲我需要將一些Objective C代碼放到Swift中。我知道我可以創建一個.h
和.m
,然後在橋接頭上包含.h
。但是在.h
中,我需要包含原始的.swift
類文件嗎?我可以有一個在Swift中部分實現的類,部分在Objective C中實現?
我該如何解決這個問題?我可以使用myclass-swift.h
嗎?謝謝。
我想擴展我在Swift中編寫的類。我想在Objective C中編寫擴展,因爲我需要將一些Objective C代碼放到Swift中。我知道我可以創建一個.h
和.m
,然後在橋接頭上包含.h
。但是在.h
中,我需要包含原始的.swift
類文件嗎?我可以有一個在Swift中部分實現的類,部分在Objective C中實現?
我該如何解決這個問題?我可以使用myclass-swift.h
嗎?謝謝。
以下的說明文件可能會對您有所幫助: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
文件。然後你在SwiftClass
ocFunction()
會是什麼樣子
func ocFunction()
{
SwiftClassOC.ocFunction(self)
}
請注意,SwiftClassOC是無狀態的,所以它本質上是一組採取SwiftClass
指針輔助功能。 SwiftClass
是維護國家的人。
這實際上是一個很好的解決方案!從來沒有想過我可以執行選擇器,而選擇器可以調用該類的obj-c版本!謝謝! –
你可以用Swift擴展一個Objective-C類,但是你不能用Objective-C擴展一個Swift類。
我想是因爲我需要把一些目標C代碼,我不能口進入斯威夫特
你可以做到這一點寫在目標C的延伸,但並不像雨燕的一部分類。我通常做的是在Objective-C中創建一個「助手」類,並將其導入到Swift中。
我在Obj-C中幾乎沒有經驗,但是難道你不能只爲swift類添加一個類? – Sweeper
@Sweeper問題是我需要添加的代碼是來自其他項目的複製粘貼代碼,由於與數據類型不兼容,無法將其轉換爲Swift(我需要使用指針數據類型,它不是存在於Swift中)。 –
很可能,Swift類不可能有ObjectiveC類別。 –