我搜索了一些帖子,我认为我无法在 Swift 下编写扩展,并从 Objective-C 代码中调用它,对吧?
@objc
像属性只支持方法、类、协议?
我搜索了一些帖子,我认为我无法在 Swift 下编写扩展,并从 Objective-C 代码中调用它,对吧?
@objc
像属性只支持方法、类、协议?
你可以编写一个 Swift 扩展并在 Objective-C 代码中使用它。使用 Xcode 6.1.1 测试。
您需要做的就是:
在 Swift 中创建你的扩展(@objc
从 Swift 4.0.3 开始需要注释)
#import "ProjectTarget-Swift.h"
在您的 Objective-C 类中(其中“ProjectTarget”表示与 Swift 扩展关联的 XCode 目标)
从 Swift 扩展中调用方法
我发现在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];
此解决方案适用于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)
}
}
如其他答案所述,导入生成的 Swift 标头在大多数情况下都有效。
一个例外是当类别定义在桥接类型上时(即扩展定义在String
而不是NSString
)。这些类别不会自动桥接到它们的 Objective-C 对应项。为了解决这个问题,您要么需要使用 Objective-C 类型(并在 Swift 代码中使用 转换返回值as String
),要么为 Swift 和 Objective-C 类型定义扩展。
在objective-c文件中导入 “#import“ProductModuleName-Swift.h”标头,并在swift文件中添加@objc infront你的extentsion。它在swift 4.2和swift 5中可以正常工作
如果您认为您已正确配置所有内容(使用@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