2014-10-28 132 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]