2015-04-09 18 views
5

Bir anahtar/değer sözlüğü oluştururken, rasgele sıralanmış olarak döndürülür. Yarattıkları ile aynı sırada olacaklarını umuyordum.Swift'de bildirilen sözlük öğelerinin sırasını koru?

[kg: 1, oz: 5, g: 2, mg: 3, lb: 4, t: 6] 

nasıl Sözlük ilan edildi sırayı korumak yapın: Bu aşağıdaki döndürür

var dict = [ 
    "kg": 1, 
    "g": 2, 
    "mg": 3, 
    "lb": 4, 
    "oz": 5, 
    "t": 6 
] 

println(dict) 

:

Örneğin, bu kodu görmek? Apple gibi

+3

[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. –

+0

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

+0

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

cevap

9

özel bir dizisi Nesneler daha uygun olabilir. Burada başlamak için yardımcı olmalıdır basit bir örnek:

struct Unit : Printable { 
    let name: String 
    let factor: Double 

    // println() should print just the unit name: 
    var description: String { return name } 
} 


let units = [ 
    Unit(name: "kg", factor: 1000.0), 
    Unit(name: "g", factor: 1.0), 
    Unit(name: "mg", factor: 0.001), 
    Unit(name: "lb", factor: 453.592292), 
    Unit(name: "oz", factor: 28.349523) 
] 

println(units) // [kg, g, mg, lb, oz] 

(I metrik olmayan birim faktörleri :) doğru

+0

Ah çok zeki, thx! – TruMan1

-1
struct MenueItem { 
let title : String 
let image : String} 


let items = [MenueItem(title: "Readers", image: "multimedia"), 
      MenueItem(title: "Live Broadcast", image: "multimedia"), 
      MenueItem(title: "Quran Browsing", image: "multimedia"), 
      MenueItem(title: "Personal Quran", image: "multimedia"), 
      MenueItem(title: "Videos", image: "multimedia"), 
      MenueItem(title: "Favorites", image: "favorites")] 

emin değilim ....

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return items.count 

....

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("MenuTableViewCell", forIndexPath: indexPath) as! MenuTableViewCell 

    cell.cellTitle.text = items[indexPath.row].title 
    cell.cellImage.image = UIImage(named: items[indexPath.row].image) 
    return cell 
} 
} 
+0

nasıl olur ?? !! Soruyu yolumda cevaplandırdım .. Soruya cevap vermek için bir örnek veriyorum .. Örnek cevaptır! Sözlüklerin sırasını çabucak soruyordu ve ben de aynı sorunla karşı karşıyayım ve bir dizi Yapı oluşturarak çözdüm ??? – Abo3atef

2

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() 
    } 
}