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];