2014-11-24 97 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

相关问题