2016-12-24 60 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

相關問題