Swift - 创建“数组”类型的自定义 class

Swift - create custom class of type `Array`

如何在 swift 中创建 Array 类型的自定义 class? 确切地说,我有一个 Car 类型的自定义 class,现在我想创建一个 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!
    }
}

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

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

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

附录

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

typealias MyCars = Array<Car>

struct Singleton {
    static var myCars = MyCars()
}

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

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

然后初始化结构体,说明初始化"took":

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 环境中,您不会使用带有静态变量的结构获得单例。这是不幸的,否则它会是实现单例数组的一种非常简单的方法。我在这个问题上遇到了很大的困难。 post 中给出了部分解决方案。在此解决方案中,您确实可以使用下标引用单例(因此单例有点像数组)。但是缺少其他数组功能(例如正常分配)。也就是说,您不能使用以下内容:

MySingletonClass.sharedInstance = ["Granada", "Pinto", "Chevette" ]

注意:我是 Swift 的新手;上述断言并没有太大的权威性。从 Swift 1.1 到 Swift 1.2,单例的定义方式发生了变化,这些变化被总结为 here. The mechanism used by Swift 1.1 to define singletons is confusing, but Martin Rue has a very readable, step-by-step development spelled out here.

祝你好运! - 乔治