什么是伞头?

ruv*_*ena 65 objective-c ios

什么是伞头?有什么用?我收到了一个警告,如下所示.这是什么意思?

<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"
Run Code Online (Sandbox Code Playgroud)

Glo*_*del 63

所述伞头为框架的"主"头文件.它的用途是你可以写

#import <UIKit/UIKit.h>
Run Code Online (Sandbox Code Playgroud)

代替

#import <UIKit/UIViewController.h>
#import <UIKit/UILabel.h>
#import <UIKit/UIButton.h>
#import <UIKit/UIDatePicker.h>
Run Code Online (Sandbox Code Playgroud)

等等.

对我来说,<XCTest/XCTestCase+AsynchronousTesting.h>包括在内<XCTest/XCTest.h>.也许它不适合你?在这种情况下,添加

#import <XCTest/XCTestCase+AsynchronousTesting.h>
Run Code Online (Sandbox Code Playgroud)

手动.

  • 文档链接为+1,解释为-1,这是错误的.UIKit不是[伞形框架](https://developer.apple.com/library/mac/documentation/MacOSX/Conceptual/BPFrameworks/Concepts/FrameworkAnatomy.html#//apple_ref/doc/uid/20002253-97623-BAJJHAJC ). (3认同)
  • `UIKit/UIkit.h`是标准(非伞)框架的"主头文件". (3认同)
  • @NikolaiRuhe XCTest也不是一个伞形框架.显然,编译器将其称为"伞状头",而"主头"则是更好的描述. (2认同)
  • @Glorfindel我不知道XCTest会发生什么诡计以及为什么clang会发出`-Wincomplete-umbrella`.但是您对伞形标题的解释确实与文档冲突.主标题与伞标题不同. (2认同)
  • 澄清一下:@Glorfindel的描述是正确的,并且*不是*特定于伞形框架(将一组框架组合在一起)-*每个*框架都有伞形头(将公共头包含在内),并且默认情况下具有相同的标题名称作为框架,如果需要使用其他名称,请[自定义模块映射](http://stackoverflow.com/a/32153383/618653) (2认同)

yoA*_*ex5 7

umbrella header- iOSframeworklibraryonObjective-CSwift可以有一个头文件,其中包含对该项目中所有其他头文件的引用。

当您创建框架目标时,Xcode 会自动生成<targer_name.h>文件。它应该具有相同的名称PRODUCT_NAME

例如<umbrella_name.h>看起来像

#import "header_1.h"
#import "header_2.h"
Run Code Online (Sandbox Code Playgroud)

或者:

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

//! Project version number for SomeModule.
FOUNDATION_EXPORT double SomeModuleVersionNumber;

//! Project version string for SomeModule.
FOUNDATION_EXPORT const unsigned char SomeModuleVersionString[];

// In this header, you should import all the public headers of your framework using statements like #import <SomeModule/PublicHeader.h>
Run Code Online (Sandbox Code Playgroud)

因此,您可以使用下一个语法

#import <umbrella_name.h>
Run Code Online (Sandbox Code Playgroud)

代替

#import <header_1.h>
#import <header_2.h>
Run Code Online (Sandbox Code Playgroud)

在实践中,当您FrameworkObjective-C[Example]Swift[Example]上创建一个时,此文件将自动创建<product_name>

使用

1. [ ]结构umbrella header需要为 Objective-C 或 Swift使用模块(公开 Objective-C 头文件).modulemap

2.umbrella header只能被Objective-C消费者使用以供纵容

3.umbrella header有助于将每个 Objective-C 头文件导入 Swift 模块,这就是为什么你可以跳过import

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

导入Objective-CSwift框架目标中