我搜索了一些帖子,我认为我不能在swift下编写扩展,并从Objective-C代码中调用它,对吧?Objective-C代码可以在Class上调用Swift扩展吗?
@objc like属性只支持方法,类,协议?
我搜索了一些帖子,我认为我不能在swift下编写扩展,并从Objective-C代码中调用它,对吧?Objective-C代码可以在Class上调用Swift扩展吗?
@objc like属性只支持方法,类,协议?
你可以写一个Swift扩展,并在ObjectiveC代码中使用它。使用XCode 6.1.1进行测试。
所有你需要做的是:
创建斯威夫特您的分机(无@objc注释)
进口 “ProjectTarget-Swift.h” 在你的ObjectiveC类(其中“ProjectTarget “表示的XCode目标迅扩展名与相关联)
呼叫从夫特扩展方法
我已经完成了这个,但仍然是编译时错误。嗯。编辑:我导入了我的桥接头,*而不是*“ProjectTarget-Swift.h”。明镜。 – 2015-03-30 13:09:26
两者都在桥接标题。不同的是,一个是在ObjC中使用Swift代码,另一个是在Swift中使用ObjC代码。Swift标题是不可见的。另一个,应该由你来管理。 – 2015-03-30 13:22:02
@mariusbardan谢谢,这绝对有用,太棒了! – brainray 2015-05-27 15:06:49
此解决方案适用于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)
}
}
然后#进口 “ProductModuleName-Swift.h”在ObjC文件。
它实际上也应该在Swift 1.2中工作。 – fatuhoku 2015-09-18 14:02:04
这不是“YourProjectsNameHere ...”,而是“YourTargetsNameHere ...”:要共享目标,您必须将其锁定为:http://dr2050.postach.io/post/importing-swift-to-objective- c-multiple-modules – 2015-12-06 00:25:00
@DanRosenstark你是对的。我正在改变它为“ProductModuleName-Swift.h”苹果建议:https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html#//apple_ref/doc/uid/ TP40014216-CH10-ID126 – 2015-12-30 14:19:24
正如其他答案中所述,导入生成的Swift标头在大多数情况下工作。
此类例外情况是在桥接类型上定义类别时(即扩展名在String
而不是NSString
上定义)。这些类别不会自动桥接到他们的Objective-C同行。为了解决这个问题,你需要使用Objective-C类型(并且在你的Swift代码中使用as String
来赋值返回值),或者为Swift和Objective-C类型定义扩展。
添加到上面的答案,你应该让你的swift扩展公开并设置其类型为NSString例如'公共扩展NSString'。如果您在编译时遇到未解决的标识符或类似错误,则可以再次转换回字符串,例如'让sVal = self作为String',然后在'sVal'上调用必要的代码 – RunLoop 2017-03-25 13:16:23
谢谢@mclaughlinj – 2017-04-11 08:05:53
@RunLoop实际上你不需要public,它将在没有作用域说明符的情况下工作。而且它(输出到Obj-C,我的意思是)对Strings不起作用,因为它们是结构体,而不是类,并且只能从Swift中获得。所以,是的 - 您可以为NSString编写扩展名,并使用强制转换或写入扩展名,如同mclaughlinj所说的,用于NSString类和String结构 – 2017-08-02 14:54:47
我发现,在雨燕4.0我不得不添加@objc
我延伸关键词的前面,以使雨燕扩展方法成为我扩展Objc类的一个实例可见。
简而言之:
文件配置设置:
CustomClass.h
CustomClass.m
CustomClassExtension.swift
在CustomClassExtension:
@objc extension CustomClass
{
func method1()
{
...
}
}
在我AppDelegate.m:
self.customClass = [[CustomClass alloc] init];
[self.customClass method1];
如果一种方法使用泛型,则不能由Objective-C和您使用将需要添加'@ nonobjc'注释。 – ThomasW 2018-03-01 10:08:18
你为什么不只是试一试? – HAS 2014-11-24 07:34:42
ide抱怨错误,但我想获得一个确定的anwser。 – sprhawk 2014-11-25 03:08:38