我搜索了一些帖子,我想我不能在swift下编写扩展名,并从Objective-C代码中调用它,对吗?
@objc like属性只支持方法,类,协议?
答案 0 :(得分:57)
我发现在 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];
答案 1 :(得分:41)
此解决方案适用于 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文件中 #import" ProductModuleName-Swift.h" 。
答案 2 :(得分:39)
如其他答案所述,导入生成的Swift标头在大多数情况下 。
例外情况是在桥接类型上定义类别(即扩展名在String
而非NSString
上定义)。这些类别不会自动桥接到其Objective-C对应物。要解决这个问题,您需要使用Objective-C类型(并使用as String
在Swift代码中强制转换返回值)或者为Swift和Objective-C类型定义扩展。
答案 3 :(得分:1)
如果认为您已正确配置了所有内容(用@objcMembers或@objc标记了Swift实体,导入了桥接标头“ ProductModuleName-Swift.h”,依此类推)–但仍然出现No visible @interface for 'FooClass' declares the selector 'fooSelector'
错误:< / p>
通过ctrl + cmd
单击以检查是否在桥接标题中看到您的界面。如果没有,请查看我对这个问题的回答:Swift to Objective-C header does not contain Swift classes
答案 4 :(得分:0)
在目标C文件中导入“#import” ProductModuleName-Swift.h“ 标头,并在扩展名的前面添加 @objc swift文件。它将在swift 4.2和swift 5中正常工作