我讀過全局變量不好。但是,全球功能呢?假設我在我的iPhone應用程序項目中添加了一個名爲Globals.swift
的文件,其中包含func foo() { print("foo") }
。是不是很糟糕,因爲它可能與其他全球功能&簽名相沖突?通過同樣的說法,使用擴展將新方法添加到現有類型不是不好嗎?斯威夫特:全球職能是不好的做法?
0
A
回答
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
創建它們的模塊,並在其名稱空間中,因此幾乎沒有衝突風險。
至於是否是好的程序設計使用免費的功能,而不是類型的方法,這是見仁見智的激烈辯論的事......
相關問題
- 1. 全球數據與UserDefaults - 斯威夫特
- 2. 斯威夫特全球陣列
- 3. 不能在斯威夫特
- 4. 斯威夫特:變量不改變(可能是全球性的問題)
- 5. XCTAssertEqual不是斯威夫特
- 6. Timer.fire()不是斯威夫特
- 7. 「hasPrefix」不是斯威夫特
- 8. 斯威夫特轉換斯威夫特
- 9. 斯威夫特2斯威夫特3
- 10. 斯威夫特 - JSQMessagesViewController與斯威夫特
- 11. 斯威夫特全球變數不更新
- 12. 斯威夫特:安全有關presentScene()的做法
- 13. 斯威夫特UNUserNotification不健全引發
- 14. 斯威夫特功能
- 15. matchesInString功能斯威夫特
- 16. 斯威夫特
- 17. 斯威夫特
- 18. 斯威夫特
- 19. 斯威夫特
- 20. 斯威夫特
- 21. 斯威夫特
- 22. 斯威夫特
- 23. 斯威夫特
- 24. 斯威夫特
- 25. 斯威夫特
- 26. 斯威夫特
- 27. 斯威夫特
- 28. 斯威夫特
- 29. 斯威夫特
- 30. 斯威夫特
看來,如果沒有指定模塊像雨燕調用內部函數。爲了測試這個,在我的iPhone應用程序項目中,我定義了全局函數'func print(text:String){Swift.print(text +「*」)}'並在應用程序啓動時調用print(「test」)''。我不確定會發生什麼,如果我包含一個定義了全局'print'功能的三十方框架。 – ma11hew28