我搜索了一些帖子,我認爲我不能在swift下編寫擴展,並從Objective-C代碼中調用它,對吧?Objective-C代碼可以在Class上調用Swift擴展嗎?
@objc like屬性只支持方法,類,協議?
我搜索了一些帖子,我認爲我不能在swift下編寫擴展,並從Objective-C代碼中調用它,對吧?Objective-C代碼可以在Class上調用Swift擴展嗎?
@objc like屬性只支持方法,類,協議?
你可以寫一個Swift擴展,並在ObjectiveC代碼中使用它。使用XCode 6.1.1進行測試。
所有你需要做的是:
創建斯威夫特您的分機(無@objc註釋)
進口 「ProjectTarget-Swift.h」 在你的ObjectiveC類(其中「ProjectTarget 「表示的XCode目標迅擴展名與相關聯)
呼叫從夫特擴展方法
我已經完成了這個,但仍然是編譯時錯誤。嗯。編輯:我導入了我的橋接頭,*而不是*「ProjectTarget-Swift.h」。明鏡。 – 2015-03-30 13:09:26
兩者都在橋接標題。不同的是,一個是在ObjC中使用Swift代碼,另一個是在Swift中使用ObjC代碼。Swift標題是不可見的。另一個,應該由你來管理。 – 2015-03-30 13:22:02
@mariusbardan謝謝,這絕對有用,太棒了! – brainray 2015-05-27 15:06:49
此解決方案適用於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文件。
它實際上也應該在Swift 1.2中工作。 – fatuhoku 2015-09-18 14:02:04
這不是「YourProjectsNameHere ...」,而是「YourTargetsNameHere ...」:要共享目標,您必須將其鎖定爲:http://dr2050.postach.io/post/importing-swift-to-objective- c-multiple-modules – 2015-12-06 00:25:00
@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
正如其他答案中所述,導入生成的Swift標頭在大多數情況下工作。
此類例外情況是在橋接類型上定義類別時(即擴展名在String
而不是NSString
上定義)。這些類別不會自動橋接到他們的Objective-C同行。爲了解決這個問題,你需要使用Objective-C類型(並且在你的Swift代碼中使用as String
來賦值返回值),或者爲Swift和Objective-C類型定義擴展。
添加到上面的答案,你應該讓你的swift擴展公開並設置其類型爲NSString例如'公共擴展NSString'。如果您在編譯時遇到未解決的標識符或類似錯誤,則可以再次轉換回字符串,例如'讓sVal = self作爲String',然後在'sVal'上調用必要的代碼 – RunLoop 2017-03-25 13:16:23
謝謝@mclaughlinj – 2017-04-11 08:05:53
@RunLoop實際上你不需要public,它將在沒有作用域說明符的情況下工作。而且它(輸出到Obj-C,我的意思是)對Strings不起作用,因爲它們是結構體,而不是類,並且只能從Swift中獲得。所以,是的 - 您可以爲NSString編寫擴展名,並使用強制轉換或寫入擴展名,如同mclaughlinj所說的,用於NSString類和String結構 – 2017-08-02 14:54:47
我發現,在雨燕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];
如果一種方法使用泛型,則不能由Objective-C和您使用將需要添加'@ nonobjc'註釋。 – ThomasW 2018-03-01 10:08:18
你爲什麼不只是試一試? – HAS 2014-11-24 07:34:42
ide抱怨錯誤,但我想獲得一個確定的anwser。 – sprhawk 2014-11-25 03:08:38