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.
祝你好运!
- 乔治
如何在 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.
祝你好运! - 乔治