我有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文件中。我说的对吗?
答案 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