2014-11-24 102 views
51

我搜索了一些帖子,我認爲我不能在swift下編寫擴展,並從Objective-C代碼中調用它,對吧?Objective-C代碼可以在Class上調用Swift擴展嗎?

@objc like屬性只支持方法,類,協議?

+1

你爲什麼不只是試一試? – HAS 2014-11-24 07:34:42

+4

ide抱怨錯誤,但我想獲得一個確定的anwser。 – sprhawk 2014-11-25 03:08:38

回答

46

你可以寫一個Swift擴展,並在ObjectiveC代碼中使用它。使用XCode 6.1.1進行測試。

所有你需要做的是:

  • 創建斯威夫特您的分機(無@objc註釋)

  • 進口 「ProjectTarget-Swift.h」 在你的ObjectiveC類(其中「ProjectTarget 「表示的XCode目標迅擴展名與相關聯)

  • 呼叫從夫特擴展方法

+3

我已經完成了這個,但仍然是編譯時錯誤。嗯。編輯:我導入了我的橋接頭,*而不是*「ProjectTarget-Swift.h」。明鏡。 – 2015-03-30 13:09:26

+0

兩者都在橋接標題。不同的是,一個是在ObjC中使用Swift代碼,另一個是在Swift中使用ObjC代碼。Swift標題是不可見的。另一個,應該由你來管理。 – 2015-03-30 13:22:02

+0

@mariusbardan謝謝,這絕對有用,太棒了! – brainray 2015-05-27 15:06:49

35

此解決方案適用於Swift 2.2和Swift 3。請注意,只能從Objective-C訪問類的擴展(不適用於結構或枚舉)。

import UIKit 

extension UIColor { 

    //Custom colours 
    class func otheEventColor() -> UIColor { 
     return UIColor(red:0.525, green:0.49, blue:0.929, alpha:1) 
    } 
} 

然後#進口 「ProductModuleName-Swift.h」在ObjC文件。

+0

它實際上也應該在Swift 1.2中工作。 – fatuhoku 2015-09-18 14:02:04

+0

這不是「YourProjectsNameHere ...」,而是「YourTargetsNameHere ...」:要共享目標,您必須將其鎖定爲:http://dr2050.postach.io/post/importing-swift-to-objective- c-multiple-modules – 2015-12-06 00:25:00

+1

@DanRosenstark你是對的。我正在改變它爲「ProductModuleName-Swift.h」蘋果建議:https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html#//apple_ref/doc/uid/ TP40014216-CH10-ID126 – 2015-12-30 14:19:24

33

正如其他答案中所述,導入生成的Swift標頭在大多數情況下工作

此類例外情況是在橋接類型上定義類別時(即擴展名在String而不是NSString上定義)。這些類別不會自動橋接到他們的Objective-C同行。爲了解決這個問題,你需要使用Objective-C類型(並且在你的Swift代碼中使用as String來賦值返回值),或者爲Swift和Objective-C類型定義擴展。

+2

添加到上面的答案,你應該讓你的swift擴展公開並設置其類型爲NSString例如'公共擴展NSString'。如果您在編譯時遇到未解決的標識符或類似錯誤,則可以再次轉換回字符串,例如'讓sVal = self作爲String',然後在'sVal'上調用必要的代碼 – RunLoop 2017-03-25 13:16:23

+0

謝謝@mclaughlinj – 2017-04-11 08:05:53

+0

@RunLoop實際上你不需要public,它將在沒有作用域說明符的情況下工作。而且它(輸出到Obj-C,我的意思是)對Strings不起作用,因爲它們是結構體,而不是類,並且只能從Swift中獲得。所以,是的 - 您可以爲NSString編寫擴展名,並使用強制轉換或寫入擴展名,如同mclaughlinj所說的,用於NSString類和String結構 – 2017-08-02 14:54:47

18

我發現,在雨燕4.0我不得不添加@objc延伸關鍵詞的前面,以使雨燕擴展方法成爲我擴展Objc類的一個實例可見。

簡而言之:

文件配置設置:

CustomClass.h 
CustomClass.m 
CustomClassExtension.swift 

在CustomClassExtension:

@objc extension CustomClass 
{ 
    func method1() 
    { 
     ... 
    } 
} 

在我AppDelegate.m:

self.customClass = [[CustomClass alloc] init]; 
[self.customClass method1]; 
+0

如果一種方法使用泛型,則不能由Objective-C和您使用將需要添加'@ nonobjc'註釋。 – ThomasW 2018-03-01 10:08:18

相關問題