Objective-C代码可以在Class上调用Swift扩展吗?

我search了一些post,我想我不能在swift下写一个扩展名,并从Objective-C代码中调用它,对吧?

@objc像属性只支持方法,类,协议?

你可以写一个Swift扩展,并在ObjectiveC代码中使用它。 使用XCode 6.1.1进行testing。

所有你需要做的是:

  • 在Swift中创build你的扩展(没有@objc注释)

  • 在你的ObjectiveC类中导入“ProjectTarget-Swift.h”(其中“ProjectTarget”代表与Swift扩展关联的XCode目标)

  • 从Swift扩展中调用方法

这个解决scheme适用于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) } } 

然后在ObjC文件中input“ProductModuleName-Swift.h”

正如其他答案中所述,导入生成的Swift头文件在大多数情况下工作

这是一个例外,当类别定义在桥接types(即扩展是定义在String而不是NSString )。 这些类别不会自动桥接到他们的Objective-C同行。 为了解决这个问题,你需要使用Objective-Ctypes(并且将你的Swift代码中的返回值转换as String ),或者为Swift和Objective-Ctypes定义一个扩展。

我发现,在Swift 4.0中,我不得不在扩展关键字前添加@objc ,以便Swift扩展方法可以通过我正在扩展的Objc类的一个实例来显示。

简而言之:

文件configuration设置:

 CustomClass.h CustomClass.m CustomClassExtension.swift 

在CustomClassExtension中:

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

在我的AppDelegate.m中:

 self.customClass = [[CustomClass alloc] init]; [self.customClass method1]; 
Interesting Posts