2015-02-12 5 views
1

В приложении, которое я разрабатываю, пользователю необходимо добавить «предприятие» для использования этого приложения. Однако они могут добавить в приложение более одного «предприятия». Каждому добавленному предприятию нужны две вещи: имя и ключ корпоративного предприятия.iOS - Локальное сохранение массива пар значений ключа

Я создал «Enterprise» класс:

class Enterprise : NSObject { 

    var name:String! 
    var apiKey:String! 

    init (name:String, apiKey:String) { 
     self.name = name 
     self.apiKey = apiKey 
    } 

    required init(coder decoder: NSCoder) { 
     self.name = decoder.decodeObjectForKey("name") as String 
     self.apiKey = decoder.decodeObjectForKey("apiKey") as String 
     super.init() 
    } 

    func encodeWithCoder(coder: NSCoder) { 
     coder.encodeObject(self.name, forKey: "name") 
     coder.encodeObject(self.apiKey, forKey: "apiKey") 
    } 

} 

Одно замечание об этом классе, в примере, я следовал, чтобы построить этот класс они суб-Оценен класс как NSCoder, а также NSObject однако, если я добавил «NSCoder» в классе, я получаю следующее сообщение об ошибке:

Multiple inheritance from classes 'NSObject' and 'NSCoder'

При сохранении массива я использую следующее:

let name = self.enterpriseName.text 
let key = self.apiKey.text 
if name != "" { 
    if key != "" { 
     let defaults = NSUserDefaults.standardUserDefaults() 
     let objectKey = "enterprise" 
     var ent = [Enterprise(name: name, apiKey: key)] 
     var entData = NSKeyedArchiver.archivedDataWithRootObject(ent) 
     defaults.setObject(entData, forKey: objectKey) 
     defaults.synchronize() 
    } 
    else { 
     println("No API key") 
    } 
} 
else { 
    println("No name") 
} 

Это похоже на работу при сохранении одного значения, но когда я проверяю, сколько элементов находится в массиве при запуске, оно показывает только 1.

Любые идеи, как я могу это сделать? Конечный результат я ищу будет что-то вроде:

Enterprises: 
    Enterprise 
     name: abc 
     apiKey: 184nfh692j6j31))8dx 

    Enterprise 
     name: def 
     apiKey: 23oih9823tng893g2gd 

    Enterprise: 
     name: ghi 
     apiKey: sfgYSS4yw44gw31!#%q 

С возможностью удаления конкретного предприятия из списка, если пользователь может выбрать, чтобы удалить его.

EDIT

Вот что получилось, используя метод (ниже, и принял ответ) Леонардо:

let name = self.enterpriseName.text 
let apiKey = self.apiKey.text 
if name != "" { 
    if apiKey != "" { 
     var enterprises = NSMutableDictionary() 
     var loadedEnterprises = Load.dictionary("enterprises") 
     if loadedEnterprises != nil { 
      if(loadedEnterprises.count > 0) { 
       for (key, value) in loadedEnterprises { 
        enterprises.setObject(value, forKey: key as String) 
       } 
      } 
     } 
     enterprises.setObject(apiKey, forKey: name)  
     Save.dictionary("enterprises", enterprises) 
    } 
    else { 
     println("No API key") 
    } 
} 
else { 
    println("No name") 
} 
+1

Вы реализуете 'NSCoding', а не вспомогательный класс' NSCoder' – Wain

ответ

1

Вы должны использовать словарь в противном случае вы можете в конечном итоге с той же предприятия с разными ключами. Я создал класс для загрузки и сохранения словарей по умолчанию для пользователя. Вы должны сделать следующим образом:

class Load { 
    class func dictionary(key:String) -> NSDictionary! { 
     return NSUserDefaults.standardUserDefaults().objectForKey(key) as? NSDictionary 
    } 
} 

class Save { 
    class func dictionary(key:String, _ value:NSDictionary) { 
     NSUserDefaults.standardUserDefaults().setObject(value, forKey: key) 
    } 
} 

class Remove { 
    class func object(key:String) { 
     NSUserDefaults.standardUserDefaults().removeObjectForKey(key) 
    } 
} 


var enterprises:[String:String] = ["abc":"184nfh692j6j31))8dx","def":"23oih9823tng893g2gd","ghi":"sfgYSS4yw44gw31!#%q"] 
Save.dictionary("enterprises", enterprises) 

name = "jkl" 
apiKey = "9a4giNifjKJq6v8G4fb" 

if !name.isEmpty { 
    if !apiKey.isEmpty { 
     enterprises[name] = apiKey 
     Save.dictionary("enterprises", enterprises) 
    } else { 
     println("No API key") 
    } 
} else { 
    println("No name") 
} 

for (key, value) in enterprises { 
    println("\(key)=\(value)") 
} 

let loadedDictionary = Load.dictionary("enterprises") 

for (key, value) in loadedDictionary { 
    println("\(key)=\(value)") 
} 
+0

Это похоже на хороший старт, но если пользователь добавляет предприятия по одному, как создается «предприятия var: [String: String]? существующие записи, добавить их в массив, а затем добавить новый в этот массив? – matcartmill

+0

var enterprise - это словарь, и я думаю, что вам не нужен массив вообще. В моем примере я начал с 3 предприятий и добавил только один в словарь. –

+0

ключ - это название предприятия и стоимость это apikey –

0

Вы всегда переопределять «Enterprise» для 'предприятия' Key, использовать массив:

var entArray = defaults.objectForKey(objectKey) 
entArray?.addObject(entData) 
defaults.setObject(entArray, forKey: objectKey) 

EDIT:

работает для меня, но это не хорошее решение:

func getEnterprise() { 
    let objectKey = "enterprise" 
    // get stored array 
    let defaults = NSUserDefaults.standardUserDefaults() 
    var array = defaults.objectForKey(objectKey) as? Array<NSData> 
    if array != nil { 
     for data in array! { 
      var enterprise = NSKeyedUnarchiver.unarchiveObjectWithData(data) as? Enterprise 
      println("\(enterprise!.name)") 
     } 
    } 
} 

func saveEnterprise() { 
    let name = self.enterpriseName 
    let key = self.apiKey 
    if name != "" && name != nil { 
     if key != "" && key != nil { 
      let defaults = NSUserDefaults.standardUserDefaults() 
      let objectKey = "enterprise" 
      var ent = Enterprise(name: name!, apiKey: key!) 

      // get stored array 
      var array = defaults.objectForKey(objectKey) as? Array<NSData> 
      if array == nil { 
       array = Array() 
      } 
      var entData = NSKeyedArchiver.archivedDataWithRootObject(ent) 
      array?.append(entData) 
      defaults.setObject(array, forKey: objectKey) 
      defaults.synchronize() 
     } 
     else { 
      println("No API key") 
     } 
    } 
    else { 
     println("No name") 
    } 
} 
+0

Когда я пытаюсь это, я получаю следующее сообщение об ошибке NSInternalInconsistencyException 'причина:' - [__ NSCFArray insertObject: atIndex]: мутирующий метод, отправленный на неизменяемый объект. – matcartmill