2016-12-24 61 views
0

我读亚光的iOS pragraming书,当我读到这里:在我们的Swift文件中,我应该在哪里导入swift模块?

斯威夫特本身就是一个模块中定义 - 斯威夫特模块。你的代码总是隐式地导入Swift模块。你可以通过使用import Swift开始一个文件来明确这一点;没有必要这样做,但它也没有害处。

这个事实很重要,因为它解决了一个重大的谜题:像print这样的东西来自哪里,为什么可以在任何消息之外将它们用于任何对象? print实际上是一个在Swift模块顶层声明的函数,你的代码可以看到Swift模块的顶层声明,因为它导入了Swift。就您的代码而言,打印功能因此变成了与其他任何打印功能一样的普通顶层功能;它对您的代码是全球性的,您的代码可以在不指定其名称空间的情况下对其进行说明。你可以指定它的命名空间 - 说Swift.print(“hello”)之类的东西是完全合法的 - 但你可能永远不会,因为没有名称冲突需要解决。

比如,在我的测试ViewController

import UIKit 
//import Swift // here we can import Swift. it is okay 

class ViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     Swift.print("hello, matt") // where we import the Swift ? 

    } 
} 

我们可以用printSwift.print,我只想问,怎么苹果隐含进口斯威夫特模块?并且明显,UIKit,我们必须导入,如果可以隐式导入Swift模块,为什么有苹果不隐式导入UIKit

我的困惑是如何隐式导入Swift模块?

+1

您的引用正确地解释了您似乎在询问的内容 – Alexander

+0

@Alexander,我更新了问题,之前是我缺乏清晰度。 – aircraft

回答

0

Swift模块的隐式导入是硬编码到Swift编译器中的行为,专门用于Swift模块。

+0

如果它是真的,我的困惑就是解决了,怎么能证明这一点?有没有“doc”或官方声明? – aircraft

+0

不是我所知道的。你可以在[编译器源代码](https://github.com/apple/swift)中寻找证据,如果你足够小心的话。无论如何,这是编译期间自动发生的一个步骤,其中的细节并不重要。这不是一个你可以用来隐式导入模块的机制,如果这就是你想要做的。 – Alexander

+0

Clang可以检测到迅速的语言语法,如果这是正确的,那么当我们创建'swift'文件时,如果它低于'Clang'检测到的,我将寻找证据,然后回复。 – aircraft

0

参考Alexandex的,我finnaly找到doc

,我们可以看到Clang importer

铛进口商(以LIB/ClangImporter实现)进口锵模块和映射的C或Objective-C的它们导出到相应的Swift API中的API。结果导入的AST可以通过语义分析来引用。

+0

这里没有什么可以暗示Swift模块是如何导入的 – Alexander

相关问题