如何在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!
}
}
答案 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。
祝你好运! - 乔治