ste*_*hen 24 interpolation objective-c swift
在我需要使用Objective C类来扩展Swift类的情况下.我做了如下的事情:
在"SomeClass.swift"中:
class SomeClass: NSObject {
}
Run Code Online (Sandbox Code Playgroud)
在"SomeClass + Extension.h"中:
#import "Project-Swift.h"
@interface SomeClass (Extension)
-(void)someMethod();
@end
Run Code Online (Sandbox Code Playgroud)
这运作良好.如果我尝试在Objective C代码中使用SomeClass扩展,那很好.
问题是,如果我想someMethod()在另一个Swift类中使用,我需要将SomeClass+Extension.h文件放入我的ObjC-BridgingHeader.h文件中.
但这样做会导致循环依赖,因为SomeClass+Extension.h也是进口Project-Swift.h.
有没有人有一个很好的方法来解决这个问题?
请注意,简单地向前声明类别标题中的类将不起作用,因为类别不能使用前向声明为它自己的实现,因为:
@class SomeClass没有导入Project-Swift.h会给出编译错误.
Cas*_*sey 16
我也一直在争论这个问题.不幸的是,文档非常明确地指出不允许这种模式:
要避免循环引用,请不要将Swift代码导入Objective-C头文件(.h).相反,您可以转发声明Swift类或协议以在Objective-C接口中引用它.
Swift类和协议的前向声明只能用作方法和属性声明的类型.
在整个链接页面中,您会注意到它一直提到将生成的标头专门导入到.m文件中:
从同一目标将Swift代码导入Objective-C
将该目标的Swift代码导入该目标中的任何Objective-C .m文件
一个可能适合您的解决方案是创建一个swift扩展,重新定义类别中所需的每个方法.它是脆弱和丑陋的,但可以说是最干净的解决方案.
/**
Add category methods from objc here (since circular references prohibit the ObjC extension file)
*/
extension SomeClass {
@nonobjc func someMethod() {
self.performSelector(Selector("someMethod"))
}
}
Run Code Online (Sandbox Code Playgroud)
@noobjc到前面允许使用相同的方法签名,而无需覆盖ObjC实现import "SomeClass+Extension.h"可以删除桥接头如果需要支持两个以上的输入参数,或者需要更紧密的类型耦合,我建议使用运行时调用底层函数.这里有一个很好的描述.