2016-01-26 20 views
0

我讀過全局變量不好。但是,全球功能呢?假設我在我的iPhone應用程序項目中添加了一個名爲Globals.swift的文件,其中包含func foo() { print("foo") }。是不是很糟糕,因爲它可能與其他全球功能&簽名相沖突?通過同樣的說法,使用擴展將新方法添加到現有類型不是不好嗎?斯威夫特:全球職能是不好的做法?

回答

6

全局函數是詞法範圍全球性的,而不是在知名度。所以你真的不需要擔心衝突。全局詞法範圍意味着它們不是類型(類,結構,協議或枚舉)的成員,也不是特定於本地範圍代碼(如另一個函數的主體)的成員。

但這與多方面的全球知名度不一樣。

如果您在名爲MyTarget的模塊(應用程序或框架)中定義頂級(又名全局)func foo(),則該函數的完全命名空間簽名爲MyTarget.foo()。即使Swift標準庫要聲明全局func foo(),你的也不一定會發生衝突。 (但是,任何呼叫站點都會變得模糊不清,因此您必須使用模塊名稱來區分MyTarget.foo()Swift.foo()。)

如果您的代碼位於要由其他代碼使用的模塊中(例如共享的框架在iOS應用程序和擴展目標之間),您的func foo()聲明爲internal。因此,導入模塊的其他代碼可以聲明自己的func foo(),並且只需調用foo()即可,無論您的函數是否存在。如果它聲明爲public func foo(),它只對導入你的模塊有影響。 (即使這樣,調用者也可以使用模塊名稱來消除歧義,如上所述)。此外,您可以選擇將函數聲明爲private以定義它所在的Swift文件,在這種情況下,它在詞法範圍內是全局的,但僅限於使用通過該文件中的其他代碼。

類型擴展遵循相同的推理 - 您的擴展默認爲internal創建它們的模塊,並在其名稱空間中,因此幾乎沒有衝突風險。

至於是否是好的程序設計使用免費的功能,而不是類型的方法,這是見仁見智的激烈辯論的事......

+0

看來,如果沒有指定模塊像雨燕調用內部函數。爲了測試這個,在我的iPhone應用程序項目中,我定義了全局函數'func print(text:String){Swift.print(text +「*」)}'並在應用程序啓動時調用print(「test」)''。我不確定會發生什麼,如果我包含一個定義了全局'print'功能的三十方框架。 – ma11hew28