Objective-c代码可以在Class上调用swift扩展吗?

时间:2014-11-24 04:04:12

标签: objective-c swift swift-extensions

我搜索了一些帖子,我想我不能在swift下编写扩展名,并从Objective-C代码中调用它,对吗?

@objc like属性只支持方法,类,协议?

5 个答案:

答案 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中正常工作