Swift:在每个子类中导入UIKit?

时间:2015-04-19 12:02:54

标签: swift inheritance uikit

在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?请建议。

2 个答案:

答案 0 :(得分:10)

简短回答:

是。我的理解是你需要在项目中的每个Swift 文件中导入所需的所有框架(这是一个逐个文件的要求,而不是逐个类。如果你定义的话单个文件中有2个类,只需要在文件顶部进行一次导入。)

C中的#import / #include语句是预处理程序指令。就好像包含文件中的代码被复制/粘贴在include的位置。如果在超类的标题中包含标题,则超类的标题现在包含展开的内容。因此,当您在子类中包含超类标头时,系统框架标头将作为超类标头的一部分包含在内。

斯威夫特的工作方式略有不同。

答案 1 :(得分:1)

如果您在Swift项目中使用任何Objective-C类并在该类中导入UIKit,则实际上不必在项目中的其他任何地方使用import UIKit指令!

所以基本上:

  1. 将Objective-C .m和/或.h文件拖放到您的项目中。如有必要,选择复制文件。确保为该文件对所有依赖项进行了排序。
  2. (可选)Xcode应该提示您创建桥接头,如果有,请继续执行步骤4 ...但是,如果没有,则必须添加头文件并将其命名为YourProjectName-Bridging-Header .h。
  3. (可选),如果您手动添加了它,请进入“项目设置”并搜索Swift Compiler。在“常规”部分中,有一个放置路径到您刚刚创建的文件的地方。
  4. 在桥接头中,通过执行#import "MyClass.h"
  5. 将Objective-C类导入到您的项目中

就是这样!您现在可以从每个文件中删除import UIKit语句。值得一提的是,出于代码重用的目的,最好在每个文件中都包含所有导入,以便每个人都可以一目了然地看到有哪些依赖关系,但是当您创建ViewControllers时,我认为拥有它是很愚蠢的在每个文件中导入UIKit。每个人都知道它依赖于UIKit,并且很有可能您不会在其他项目中重复使用UI。