我搜索了一些帖子,我想我不能在swift下编写扩展,然后从Objective-C代码中调用它,对吗?
@objc之类的属性仅支持方法,类,协议?
Answers:
您可以编写一个Swift扩展并将其用在Objective-C代码中。使用XCode 6.1.1测试。
您需要做的只是:
在Swift中创建扩展(无@objc
注释)
#import "ProjectTarget-Swift.h"
在Objective-C类中(其中“ ProjectTarget”表示Swift扩展与之关联的XCode目标)
从Swift扩展中调用方法
更新:
自@Rizwan Ahmed提到的,您需要添加@objc
注释:
从Swift 4.0.3开始,如果要在Objective C类文件中使用扩展名,则需要@objc批注。
我发现在Swift 4.0中,我必须@objc
在扩展程序的前面添加关键字以使Swift扩展方法对我正在扩展的Objc类的实例可见。
简而言之:
文件配置设置:
CustomClass.h
CustomClass.m
CustomClassExtension.swift
在CustomClassExtension中:
@objc extension CustomClass
{
func method1()
{
...
}
}
在我的AppDelegate.m中:
self.customClass = [[CustomClass alloc] init];
[self.customClass method1];
@nonobjc
注释。
此解决方案适用于Swift 2.2和Swift 3。请注意,只能从Objective-C访问类的扩展(不适用于结构或枚举)。
import UIKit
extension UIColor {
//Custom colours
class func otherEventColor() -> UIColor {
return UIColor(red:0.525, green:0.49, blue:0.929, alpha:1)
}
}
然后#import“ ProductModuleName-Swift.h”在您的ObjC文件中。
斯威夫特4
extension UIColor {
// As of Swift 4.0.3, the @objc annotation is needed if you want to use the extension in Objective-C files
@objc
class func otherEventColor() -> UIColor {
return UIColor(red:0.525, green:0.49, blue:0.929, alpha:1)
}
}
public
有需要的理由吗?没有public
修饰符,对我来说效果很好。我们是否假设扩展名不在同一个项目中,而是从另一个项目中导入的?
如其他答案所述,在大多数情况下,导入生成的Swift标头即可。
例外是,类别是在桥接类型上定义的(即,扩展名是在String
而不是上定义的NSString
)。这些类别不会自动桥接到其Objective-C对应项。为了解决这个问题,您要么需要使用Objective-C类型(并使用来转换Swift代码中的返回值as String
),要么为Swift和Objective-C类型定义扩展名。
public extension NSString
。如果您在编译时遇到无法解析的标识符或类似错误,则可以再次let sVal = self as String
将其sVal
mclaughlinj