我搜索了一些帖子,我认为我不能在Swift下编写一个扩展(extension),并从Objective-C代码中调用它,对吗?
@objc
等类似属性只支持方法、类和协议吗?
我搜索了一些帖子,我认为我不能在Swift下编写一个扩展(extension),并从Objective-C代码中调用它,对吗?
@objc
等类似属性只支持方法、类和协议吗?
您可以编写一个Swift扩展并在Objective-C代码中使用它。已经使用Xcode 6.1.1进行了测试。
您只需要:
在Swift中创建您的扩展(自Swift 4.0.3以来需要@objc
注释)
在Objective-C类中导入#import "ProjectTarget-Swift.h"
(其中“ProjectTarget”表示与Swift扩展相关联的XCode目标)
调用Swift扩展中的方法
我发现在 Swift 4.0 中,我必须在我的 extension 关键字前面添加 @objc
,才能让我扩展的 Objc 类型实例看到 Swift 扩展方法。
简而言之:
文件配置设置:
CustomClass.h
CustomClass.m
CustomClassExtension.swift
在CustomClassExtension中:
@objc extension CustomClass
{
func method1()
{
...
}
}
在我的AppDelegate.m文件中:
self.customClass = [[CustomClass alloc] init];
[self.customClass method1];
@nonobjc
注释。 - ThomasW这个解决方案适用于 Swift 2.2 和 Swift 3。请注意,仅限于类的扩展(而不是结构体或枚举)将可从 Objective-C 中访问。
这个解决方案适用于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)
}
}
在您的 ObjC 文件中,然后导入 #import "ProductModuleName-Swift.h"。
Swift 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)
}
}
如其他答案所述,在大多数情况下,导入生成的Swift头文件是有效的。
但有一个例外,即当类别定义在桥接类型上时(即扩展定义在String
而不是NSString
上)。这些类别将无法自动桥接到它们的Objective-C对应项。为了解决这个问题,您需要使用Objective-C类型(并在您的Swift代码中使用as String
进行返回值转换),或者定义Swift和Objective-C类型的扩展。
public extension NSString
。如果在编译时出现未解决的标识符或类似的错误,你可以再次将其转换回 String,例如 let sVal = self as String
,然后在 sVal
上调用必要的代码。 - RunLoopmclaughlinj
所说的那样,编写 NSString 类和 String 结构体的扩展。 - Alex Nazarov在Objective-C文件中导入"#import "ProductModuleName-Swift.h"头文件,并在Swift文件中的extension前面添加@objc。这样可以在Swift 4.2和Swift 5中正常工作。
ctrl + cmd
单击查看桥接头文件中是否显示了您的接口。如果没有,请查看我对此问题的回答:Swift to Objective-C header does not contain Swift classes