112

我搜索了一些帖子,我认为我无法在 Swift 下编写扩展,并从 Objective-C 代码中调用它,对吧?

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

4

6 回答 6

111

你可以编写一个 Swift 扩展并在 Objective-C 代码中使用它。使用 Xcode 6.1.1 测试。

您需要做的就是:

  • 在 Swift 中创建你的扩展(@objc从 Swift 4.0.3 开始需要注释)

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

  • 从 Swift 扩展中调用方法

于 2015-02-04T12:09:46.133 回答
79

我发现在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];
于 2017-10-23T20:09:48.670 回答
51

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

斯威夫特 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)
    }
}
于 2015-08-28T16:45:11.343 回答
43

如其他答案所述,导入生成的 Swift 标头在大多数情况下都有效。

一个例外是当类别定义在桥接类型上时(即扩展定义在String而不是NSString)。这些类别不会自动桥接到它们的 Objective-C 对应项。为了解决这个问题,您要么需要使用 Objective-C 类型(并在 Swift 代码中使用 转换返回值as String),要么为 Swift 和 Objective-C 类型定义扩展。

于 2016-02-29T16:57:49.470 回答
3

在objective-c文件中导入 “#import“ProductModuleName-Swift.h”标头,并在swift文件中添加@objc infront你的extentsion。它在swift 4.2和swift 5中可以正常工作

于 2019-05-29T11:28:09.377 回答
2

如果您认为您已正确配置所有内容(使用@objcMembers 或@objc 标记您的Swift 实体,导入桥接头“ProductModuleName-Swift.h”等等)——但仍然No visible @interface for 'FooClass' declares the selector 'fooSelector'出现错误:

通过ctrl + cmd单击它来检查您是否在桥接头中看到您的接口。如果你不这样做,请查看我对这个问题的回答:Swift to Objective-C header does not contain Swift classes

于 2020-09-15T13:36:03.827 回答