默认情况下是否导入Foundation?

时间:2019-10-23 12:48:19

标签: swift

我有Cocoa Touch Framework。以下三个代码示例均可以成功编译为我的Framework。

import Foundation
protocol X {
    var a: Data { get }
}
protocol X {
    var a: Foundation.Data { get }
}
protocol X {
    var a: Data { get }
}

最后一个使用Foundation中的类型,而无需任何导入此模块。如果模块头(.h文件)包含#import <UIKit/UIKit.h>(默认生成),Foundation默认情况下是否导入到Swift文件中?


注意(19.10.19)

我在模块头文件(.h文件)中删除了#import <UIKit/UIKit.h>并将FOUNDATION_EXPORT替换为extern。之后,我将import Foundation添加到了我的swift文件中。结果,仅第一个代码示例是可编译的。

据我了解,是否将模块导入到另一个模块的标头(.h)中-无需将第一个模块导入第二个模块的Swift文件中。我说的对吗?

1 个答案:

答案 0 :(得分:1)

是的,UIKit导入了Foundation,因此,如果您有#import <UIKit/UIKit.h>import UIKit,则无需导入Foundation

UIKit的源快速代码Here中查看一下

修改

Here是有关模块如何快速工作的有用信息,

  

您还可以有选择地从模块中导入某些声明:

import func Chess.createGreedyPlayer
import class Foundation.NSRegularExpression
     

与其他语言的比较

     

导入模块就像在Ruby,Python或Perl中导入库一样,   导入Java类,或在C系列中包含头文件   语言。但是,与C不同,模块文件不是文本形式包含的   并且必须是有效的程序,并且不得以文字形式显示   格式。与Java不同,模块中的声明不可见   直到进口。与上述动态语言不同,   导入模块不能自动导致任何代码运行。

快速导入模块使用以下三种语法之一:

import [module]
import [module].[submodule]
import [import kind] [module].[symbol name]

当我们在导入Data时未指定导入类型时,实际上我们仍在导入整个Foundation

有多种允许的进口种类:

typealias | struct | class | enum | protocol | let | var | func
  

与其他任何代码体一样,一个模块可能依赖于   它的实现。模块实施者也可以选择   重新导出这些模块,这意味着任何导入第一个模块的人   模块还将有权访问重新导出的声明   模块。

     

@exported import AmericanCheckers

     

例如,OS X上的“ Cocoa”框架仅用于重新导出   其他三个框架:AppKit,Foundation和CoreData。

     

就像某些声明可以从   模块,因此也可以使用相同的模块有选择地将其重新导出   语法:

     

@exported import class AmericanCheckers.Board