Objective-C 代码可以调用 Swift 类扩展吗?

我搜索了一些帖子,我想我不能在 Swift 下面写一个扩展,然后从 Objective-C 代码调用它,对吗?

类似 @objc的属性只支持方法、类、协议?

65786 次浏览

您可以编写一个 Swift 扩展并在 Objective-C 代码中使用它。

你要做的就是:

  • 在 Swift 中创建扩展(自 Swift 4.0.3以来需要 @objc注释)

  • Objective-C 类中的 #import "ProjectTarget-Swift.h"(其中“ ProjectTarget”表示与 Swift 扩展关联的 XCode 目标)

  • 从 Swift 扩展调用方法

此解决方案适用于 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)
}
}

Then # import“ ProductModuleName-Swift.h” in your ObjC file.

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 头可以工作 in most cases

这种情况的一个例外是,类别是在桥接类型上定义的(也就是说,扩展是在 String而不是 NSString上定义的)。这些类别不会自动连接到 Objective-C 对应物。为了解决这个问题,您要么需要使用 Objective-C 类型(并用 as String在 Swift 代码中强制转换返回值) ,要么同时为 Swift 和 Objective-C 类型定义一个扩展。

我发现在 Swift 4.0中,我必须在我的 分机关键字前面添加 @objc,以便 Swift 扩展方法能够被我正在扩展的 Objecc 类的实例看到。

简而言之:

文件配置设置:

CustomClass.h
CustomClass.m
CustomClassExtension.swift

In CustomClassExtension:

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

在我的应用代表网站上:

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

导入目标 -c 文件中的 "#import "ProductModuleName-Swift.h"头,并在快速文件中在 extentsion前面添加 @ objecc。在 Swift 4.2和 Swift 5中都能正常工作

如果认为已经正确配置了所有内容(将 Swift 实体标记为@objeccMember 或@objecc,则导入桥接头“ ProductModuleName-Swift。等等)-但仍然得到 No visible @interface for 'FooClass' declares the selector 'fooSelector'错误:

通过单击 ctrl + cmd,检查是否在桥接头 中看到了接口。如果你不这么认为,那么看看我对这个问题的回答吧: “ Swift to Objective-C”头部不包含 Swift 类