[英]Swift - create custom class of type `Array`
如何快速創建Array
類型的自定義類? 確切地說,我有一個類型為Car
的自定義類,現在我想創建一個由Car
的單例。 (因為我希望能夠從我的應用程序中的任何位置訪問它)。
我的解決方法是將我的單身人士定義為NSMutableArray
。 但是我看到這在我的代碼中引起了一些問題。 因此,我希望將其定義為快速數組。 我該怎么做?
我的代碼現在是:
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
的單例數組,您無需創建新類-只需帶有靜態成員的結構即可:
struct MyCars {
static var sharedInstance = Array<Car>()
}
請注意, sharedInstance
初始化一次-閱讀此答案以獲取更多信息
附錄
如果要使用MyCars
引用Car
數組,則可以只定義一個類型別名,並為包含單例的結構使用其他名稱,例如:
typealias MyCars = Array<Car>
struct Singleton {
static var myCars = MyCars()
}
據我了解,單例表示一個類或結構,對於該類或結構,只能有一個實例。 即使有人嘗試實例化單例的新副本,他們也會以指向唯一實例的指針結束。 (我是從《 Big Nerd Ranch指南》(iOS編程)中得到這個想法的,但似乎沒有爭議)。 我認為上面提出的struct解決方案不符合此標准。 例如,在操場上創建建議的結構(我已將“字符串”類型替換為“汽車”類型以簡化測試):
struct MyCars {
static var sharedInstance = Array<String>()
}
然后初始化結構並顯示初始化“完成”:
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的結構的單例。 這很不幸,因為否則它將是實現單例數組的非常簡單的方法。 我在這個問題上遇到了很大的困難。 這篇文章已經闡明了部分解決方案。 在此解決方案中,您確實使用下標引用了單例(因此,單例有點像數組)。 但是缺少其他陣列功能(例如常規分配)。 也就是說,您不能使用以下內容:
MySingletonClass.sharedInstance = [“格拉納達”,“賓托”,“雪佛蘭”]
注意:我是Swift的新手。 上述主張沒有太多權威。 從Swift 1.1到Swift 1.2在定義單例方面都有改變,這些改變總結在這里 。 Swift 1.1用來定義單例的機制令人困惑,但是Martin Rue 在這里闡明了一個非常易讀的分步開發。
祝好運! - 喬治
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.