什么是伞头?


72

雨伞头基本上是什么?它有什么用?我收到如下警告。这是什么意思?

<module-includes>:1:1: warning: umbrella header for module 'XCTest' does not include header 'XCTextCase+AsynchronousTesting.h' [-Wincomplete-umbrella]
#import "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Frameworks/XCTest.framework/Headers/XCTest.h"

2
您的项目是由椰壳动物组成的吗?
poojathorat

1
不,我正在使用可可粉
ruveena 2015年

Answers:


68

所述伞头为框架的“主”头文件。它的用途是你可以写

#import <UIKit/UIKit.h>

代替

#import <UIKit/UIViewController.h>
#import <UIKit/UILabel.h>
#import <UIKit/UIButton.h>
#import <UIKit/UIDatePicker.h>

等等。

对我来说,<XCTest/XCTestCase+AsynchronousTesting.h>包含在中<XCTest/XCTest.h>。也许不适合您?在这种情况下,请添加

#import <XCTest/XCTestCase+AsynchronousTesting.h>

手动。


5
+1为文档链接,-1为说明,这是错误的。UIKit不是一个伞形框架
Nikolai Ruhe 2015年

4
UIKit/UIkit.h是标准(不是伞形)框架的“主头文件”。
Nikolai Ruhe 2015年

2
@NikolaiRuhe XCTest也不是一个伞形框架。显然,编译器将其称为“伞头”,而“主头”将是一个更好的描述。
Glorfindel

2
@Glorfindel我不知道XCTest会发生什么骗术,以及为什么clang会发出-Wincomplete-umbrella。但是您对伞形标头的解释确实与文档冲突。主标头与伞形标头不同。
Nikolai Ruhe

2
澄清一下:@Glorfindel的描述是正确的,并且特定于伞形框架(该框架将一组框架分组)-每个框架都有一个伞形头(将公共头包含在内),并且默认情况下与框架名称相同,如果您需要使用其他名称,请自定义modulemap
t0rst

6

umbrella header-iOSframework或更高版本libraryObjective-C的头文件可以包含对该项目中所有其他头的引用。

创建目标框架时,Xcode将自动生成<targer_name.h>文件。它应该与Product Name

Build Settings

  • Product Name -默认值为 $(TARGET_NAME:c99extidentifier)
  • Product Module Name -默认值为 $(PRODUCT_NAME:c99extidentifier)

例如<umbrella_name.h>看起来像

#import "header_1.h"
#import "header_2.h"

结果,您可以使用下一个语法

#import <umbrella_name.h>

代替

#import <header_1.h>
#import <header_2.h>

此外umbrella header,还需要通过典型module map 结构[关于] [手动创建]

在实践中,当您FrameworkObjective-C[示例]Swift[示例]上创建此文件时,将使用<product_name>

导入Objective-CSwift一个框架内的目标

在伞状标题中,导入要公开给Swift的每个Objective-C标题。

Swift会在您的伞形标题中看到您公开公开的每个标题。该框架中的Objective-C文件的内容可从该框架目标内的任何Swift文件中自动获得,而无需导入语句。使用与系统类相同的Swift语法,使用Objective-C代码中的类和其他声明。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.