在Objective-C中,我们可以这样做:
一个。在超类中导入文件
#import "MyAwesomeClass.h"
@interface MySuperViewController : UIViewController
@end
@implementation MySuperViewController
- (void)viewDidLoad {
[super viewDidLoad];
//MyAwesomeClass allocated, initialized, used
MyAwesomeClass *awesomeClass = [MyAwesomeClass new];
}
@end
湾使用在超类中导入的文件,在子类中而不重新导入它
@interface MySubViewController : MySuperViewController
@end
@implementation MySubViewController
- (void)viewDidLoad {
[super viewDidLoad];
//No compilation error, since MyAwesomeClass already imported in superclass
MyAwesomeClass *awesomeClass = [MyAwesomeClass new];
}
@end
尝试在swift中执行相同的操作会产生编译错误:
一个。在MySuperViewController中导入UIKit
import UIKit
class MySuperViewController : UIViewController {
@IBOutlet weak var enterPrice: UITextField!
}
湾声明和使用UITextField的对象而不在MySubViewController中导入UIKit
class MySubViewController: MySuperViewController {
// compilation error at below line
@IBOutlet weak var myButton: UIButton!
}
我们有什么方法可以避免在上述场景中重新导入UIKit?请建议。
答案 0 :(得分:10)
简短回答:
是。我的理解是你需要在项目中的每个Swift 文件中导入所需的所有框架(这是一个逐个文件的要求,而不是逐个类。如果你定义的话单个文件中有2个类,只需要在文件顶部进行一次导入。)
C中的#import / #include语句是预处理程序指令。就好像包含文件中的代码被复制/粘贴在include的位置。如果在超类的标题中包含标题,则超类的标题现在包含展开的内容。因此,当您在子类中包含超类标头时,系统框架标头将作为超类标头的一部分包含在内。
斯威夫特的工作方式略有不同。
答案 1 :(得分:1)
如果您在Swift项目中使用任何Objective-C类并在该类中导入UIKit,则实际上不必在项目中的其他任何地方使用import UIKit
指令!
所以基本上:
#import "MyClass.h"
就是这样!您现在可以从每个文件中删除import UIKit
语句。值得一提的是,出于代码重用的目的,最好在每个文件中都包含所有导入,以便每个人都可以一目了然地看到有哪些依赖关系,但是当您创建ViewControllers时,我认为拥有它是很愚蠢的在每个文件中导入UIKit。每个人都知道它依赖于UIKit,并且很有可能您不会在其他项目中重复使用UI。