2014-10-28 156 views
25

我想創建一個可以在整個應用程序(AppDelegate,ViewController類,TableViewController類等)中訪問的全局自定義對象數組。我研究了一種方法來做到這一點,但還沒有找到答案。我試圖做給陣列公開範圍,但我得到一個編譯器警告,它說Declaring public variable from internal class,當我嘗試訪問它在不同的文件,我得到的是說Use of unresolved identifier 'arrayObjectives'在Swift中聲明全局變量

我將如何去做出一個錯誤數組全局可訪問應用程序中的所有文件,以及我將在哪裏實例化該數組?

回答

21

Swift Programming Language -

全局變量是任何 函數,方法,關閉,或類型的上下文之外定義的變量

所以,你可以在簡單地聲明你的變量在import聲明之後的任何文件的頂部。

但是,我建議你認真重新考慮一下。一般來說全局變量不是一個好主意。您最好使用單例屬性或使用依賴注入。

第二個問題「我將在哪裏實例化數組?是全局變差的原因之一 - 它們的生命週期沒有很好地定義其他對象。首次使用時初始化的單例消除了這個問題。

+1

如果使用'private'作爲訪問修飾符,則全局變量將在您聲明的swift文件中成爲全局變量......在需要靜態變量的情況下(因爲'class'尚不受支持),這非常有用 – Soko 2015-01-05 12:01:54

+1

Globals是Swift的完全自然和慣用的部分。 – Fattie 2017-02-21 14:34:22

+1

當然,還有C和其他一些語言。這並不意味着他們是個好主意。全局常量是可以的,但全局變量在多線程,面向對象的異步環境中有許多缺點。 – Paulw11 2017-02-21 20:11:18

13

您可以設置全局陣列像這樣:

import UIKit 

var abc : String = String() 

,你可以訪問它的任何其他文件,如:

abc = "ABC" 
+0

我該在哪裏設置?我知道我不能在功能上做到這一點,但是當我嘗試在課堂上做到這一點時,我會收到上面提到的編譯器警告。 – 2014-10-28 05:03:05

+1

確切地說,他們向你展示了 - 在任何函數或類之外 – Paulw11 2014-10-28 05:18:41

+0

是的這種方式我們可以聲明和訪問全局變量.. :) – 2014-10-28 05:20:12

5

這是我做到了......

class MessageViewCell { 
    struct MessageViewCellHeightCache { 
     static var cache: [String:CGFloat] = Dictionary<String, CGFloat>() 
    } 
} 

我訪問它如下:

MessageViewCell.MessageViewCellHeightCache.cache["first"] = 12.0 
+2

這不是全球性的。這是一個單身模式 – Paulw11 2014-10-28 05:12:15

+0

@ Paulw11 - 單身人士是這些情況下最好的 – 2014-10-28 05:15:51

+2

我同意 - 請參閱我的答案。這個答案並不強調它是一個單身而不是全球的。 – Paulw11 2014-10-28 05:17:47

7

嘗試進行新雨燕文件與此:

struct Constants { 

    static let appName: String = "My App" 

    struct Colors { 

    static let colorTextStandard = UIColor(red: 0/255, green: 0/255, blue: 0/255, alpha: 0.3) //#000000 

    } 

    struct Data { 

    static var myStrings = [String]() // Yea, this is not a constant, but that's alright... 

    } 

} 

然後,您可以用指那些全局常量(或者你可以讓他們的變量):

Constants.appName 

Constants.Colors.colorTextStandard 

Constants.Data.myStrings = [stringOne, stringTwo]