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

spr*_*awk 87 objective-c swift swift-extensions

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

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

mar*_*dan 69

您可以编写Swift扩展并在ObjectiveC代码中使用它.使用XCode 6.1.1进行测试.

你需要做的就是:

  • 在Swift中创建扩展(没有@objc注释)

  • 在ObjectiveC类中导入"ProjectTarget-Swift.h"(其中"ProjectTarget"表示与Swift扩展相关联的XCode目标)

  • 从Swift扩展中调用方法

  • 从Swift 4.0.3开始,如果要在Objective C类文件中使用扩展,则需要@objc注释. (30认同)
  • 我已经完成了这个,但它仍然是一个编译时错误.嗯.编辑:我导入了我的桥接标题**而不是"ProjectTarget-Swift.h".明镜. (6认同)

And*_* P. 63

我发现在Swift 4.0中我必须@objc在我的扩展关键字前添加,以便Swift扩展方法被我正在扩展的Objc类的实例看到.

简而言之:

文件配置设置:

CustomClass.h
CustomClass.m
CustomClassExtension.swift
Run Code Online (Sandbox Code Playgroud)

在CustomClassExtension中:

@objc extension CustomClass
{
    func method1() 
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的AppDelegate.m中:

self.customClass = [[CustomClass alloc] init];
[self.customClass method1];
Run Code Online (Sandbox Code Playgroud)

  • 如果方法使用泛型,则 Objective-C 不能使用它,您需要添加 `@nonobjc` 注释。 (2认同)

Fot*_*Dim 42

此解决方案适用于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)
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在你的ObjC文件中#import"ProductModuleName-Swift.h".

  • 不适用于swift 2.3>没有可见的@interface (3认同)

mcl*_*inj 40

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

当类别上的桥接类型定义(即延伸部被限定在一个例外是String,不NSString).这些类别不会自动桥接到他们的Objective-C对应物.要解决这个问题,您需要使用Objective-C类型(并在Swift代码中强制转换返回值as String)或者为Swift和Objective-C类型定义扩展.

  • 添加上面的答案,你应该将你的swift扩展公开,并将其类型设置为NSString,例如`public extension NSString`.如果在编译时遇到未解析的标识符或类似错误,可以再次强制转换为String,例如`let sVal = self as String`,然后在`sVal上调用必要的代码 (2认同)