Ne yazık ki, Apple sadece Swift'in kutusundan çıkardığı üç koleksiyon veri yapısında kuruldu. Bunlar Dizi, Sözlük ve Kümedir. Neyse ki, Apple kendi koleksiyon sınıflarınızı kolayca ve zarif bir şekilde tanımlamanızı destekleyen çok kapsamlı ve güçlü bir protokol hiyerarşisi geliştirdi.
Bu nedenle, çözümünüzün ek boşluğunu (ve belki de zaman) karmaşıklığını düşünmüyorsanız, siparişinizi koruyan bir Sözlüğe benzeyen kendi Swift koleksiyon sınıfınızı/yapınızı oluşturmayı tercih edebilirsiniz. indeksleri tuşlara bağlayarak ve bunun tersi olarak, elemanlar eklenmiştir. Kendi koleksiyon veri yapılarınızı oluşturma hakkında daha fazla bilgi için belgelere bakın: https://developer.apple.com/documentation/swift/collection.
Yasal Uyarı::
sana gitmem bir şeyler vereceğiz Bu kod test değildir ve ben algoritmik karmaşıklık konularda düşünce bir hayli geçirmedik. Lütfen çözümünüzün gereksinimlerini belirleyin ve aşağıdaki kodun uyumlu olup olmadığını kontrol edin.
public struct KeepOrderDictionary<Key, Value> where Key : Hashable
{
public private(set) var values: [Value]
fileprivate var keyToIndexMap: [Key:Int]
fileprivate var indexToKeyMap: [Int:Key]
public init()
{
self.values = [Value]()
self.keyToIndexMap = [Key:Int]()
self.indexToKeyMap = [Int:Key]()
}
public var count: Int
{ return values.count}
public mutating func add(key: Key, _ value: Value)
{
if let index = keyToIndexMap[key]
{ values[index] = value}
else
{
values.append(value)
keyToIndexMap[key] = values.count - 1
indexToKeyMap[values.count - 1] = key
}
}
public mutating func add(index: Int, _ value: Value) -> Bool
{
if let key = indexToKeyMap[index]
{
add(key: key, value)
return true
}
return false
}
public func get(key: Key) -> (Key, Value)?
{
if let index = keyToIndexMap[key]
{ return (key, values[index])}
return nil
}
public func get(index: Int) -> (Key, Value)?
{
if let key = indexToKeyMap[index]
{ return (key, values[index])}
return nil
}
public mutating func removeValue(forKey key: Key) -> Bool
{
guard let index = keyToIndexMap[key] else
{ return false}
values.remove(at: index)
keyToIndexMap.removeValue(forKey: key)
indexToKeyMap.removeValue(forKey: index)
return true
}
public mutating func removeValue(at index: Int) -> Bool
{
guard let key = indexToKeyMap[index] else
{ return false}
values.remove(at: index)
keyToIndexMap.removeValue(forKey: key)
indexToKeyMap.removeValue(forKey: index)
return true
}
}
extension KeepOrderDictionary
{
public subscript(key: Key) -> Value?
{
get
{ return get(key: key)?.1}
set
{
if let newValue = newValue
{ add(key: key, newValue)}
else
{ let _ = removeValue(forKey: key)}
}
}
public subscript(index: Int) -> Value?
{
get
{ return get(index: index)?.1}
set
{
if let newValue = newValue
{ let _ = add(index: index, newValue)}
}
}
}
extension KeepOrderDictionary : ExpressibleByDictionaryLiteral
{
public init(dictionaryLiteral elements: (Key, Value)...)
{
self.init()
for entry in elements
{ add(key: entry.0, entry.1)}
}
}
extension KeepOrderDictionary : Sequence
{
public typealias Iterator = IndexingIterator<[(key: Key, value: Value)]>
public func makeIterator() -> KeepOrderDictionary.Iterator
{
var content = [(key: Key, value: Value)]()
for i in 0 ..< count
{
if let value: Value = self[i], let key: Key = indexToKeyMap[i]
{ content.append((key: key, value: value))}
}
return content.makeIterator()
}
}
[dokümantasyon] (https://developer.apple.com/library/ios/documentation/General/Reference/SwiftStandardLibraryReference/Dictionary.html) açıkça belirtmektedir: Bir sözlük bir yöneten genel türüdür * * Sıralanmamış ** anahtar/değer çiftleri koleksiyonu.- Ayrıca bkz. Http://stackoverflow.com/questions/26546488/dictionary-printing-results-backwards. –
Sözlük ve siparişi tutan kendi türünüzü oluşturmanız gerekir. Bunu yapmak için yerleşik bir tipi yoktur. – Kirsteins
Bummer, bu büyük bir sınırlama. Anahtarlara veya değerlere göre sıralamak istemiyorum, sadece bildirildikleri sırada görünmelerini istiyorum. – TruMan1