Swift - 创建类型为`Array`的自定义类

时间:2015-01-14 11:46:52

标签: arrays swift singleton

如何在swift中创建Array类型的自定义类? 确切地说,我有一个类型Car的自定义类,现在我想创建一个Car数组的单例。 (因为我希望能够从我的应用中的任何地方访问它。)

我的解决方法是将我的单身人士定义为NSMutableArray。但我发现这会导致我的代码出现问题。所以我希望将它定义为swift数组。 我该怎么办?

我的代码现在是:

class MyCars: NSMutableArray {
    class var sharedInstance: MyCars {
        struct Static {
            static var instance: MyCars?
            static var token: dispatch_once_t = 0
        }

        dispatch_once(&Static.token) {
            Static.instance = MyCars()
        }

        return Static.instance!
    }
}

2 个答案:

答案 0 :(得分:2)

要创建Car的单例数组,您不需要创建一个新类 - 只需一个带有静态成员的结构:

struct MyCars {
    static var sharedInstance = Array<Car>()
}

请注意sharedInstance初始化一次 - 阅读this answer了解更多信息

<强>附录

如果您想使用MyCars来引用Car数组,您只需定义一个类型,并为包含单例的结构使用不同的名称,例如:

typealias MyCars = Array<Car>

struct Singleton {
    static var myCars = MyCars()
}

答案 1 :(得分:0)

据我了解,单例表示一个类或结构,其中只能有一个实例。即使有人试图实例化单例的新副本,他们也会用指针返回唯一的实例。 (我从iOS编程的Big Nerd Ranch指南中得到了这个想法,但它似乎没有争议)。我不认为上面提出的结构解决方案符合这个标准。例如,在游乐场中创建建议的结构(我为'Car'类型替换'String'类型以使测试更容易):

struct MyCars {
    static var sharedInstance = Array<String>()
}

然后初始化结构并显示初始化“take”:

MyCars.sharedInstance = ["Granada", "Pinto", "Chevette"]
println( MyCars.sharedInstance )
// prints all three car names

现在尝试创建数据的副本并显示它的工作原理,然后修改副本:

var myCars = MyCars.sharedInstance
println( myCars )
// the above prints all three cars
myCars.append("Gremlin")

这两个变量是否指向不同的集合?测试:

println( MyCars.sharedInstance )
// the above prints three cars
println( myCars )
// the above prints four cars 

因此,在Playground环境中,您不会使用带有静态var的结构获得单例。这是不幸的,因为否则它将是一种实现单例数组的非常简单的方法。我遇到这个问题很困难。已在此post中详细说明了部分解决方案。在这个解决方案中,您可以使用下标来引用单例(因此单例类似于数组)。但是缺少其他阵列特征(例如,正常分配)。也就是说,您不能使用以下内容:

MySingletonClass.sharedInstance = [“Granada”,“Pinto”,“Chevette”]

注意:我对Swift很新;上述断言并没有太大的权威性。从Swift 1.1到Swift 1.2的变化是如何定义单例的,并且总结了这些变化here。 Swift 1.1用来定义单例的机制令人困惑,但是Martin Rue有一个非常易读的逐步开发here

祝你好运! - 乔治