2016-02-28 2 views
0

У меня возникли проблемы с кодированием, по-видимому, простой задачи. Я хочу добавить новые данные профиля клиента в словарь профиля клиента (clientDatabase), но продолжать получать ошибки - не может показаться append - error: value of type (String: clientProfile) 'не имеет членского приложения append' (см. Ошибку на нижняя часть кода)SWIFT добавить данные в словарь

Любые идеи, которые вы можете предоставить, очень ценятся.

Спасибо, Билл

//: Playground - noun: a place where people can play 

import UIKit 
import Foundation 



/* 
code copied from B-C Dev Database - structs but simplified with fewer variables 
goal is to getappend new client to work. 
*/ 

/* 
Globals: these go in main.swift file 
*/ 

struct clientProfile { 

    var firstName: String = "" 
    var lastName: String = "" 
    var group: Int = 0 
} 
//var clientDatabase : NSMutableDictionary! = [String:clientProfile]() 
var clientDatabase:[String:clientProfile] 

/* sample data template: phone is key, sub array is; 
(firstName: "", lastName: "",pilatesGroup: ) 
*/ 
clientDatabase = [ 
    "1234567": clientProfile(firstName: "Sally", lastName: "Sillious", group: 3), 
    "2345678": clientProfile(firstName: "Sue", lastName: "Parker",group: 8), 
    "3456789": clientProfile(firstName: "Bob", lastName: "Parker", group: 2), 
    "5678901": clientProfile(firstName: "Jim", lastName: "Beam", group: 12) 
     ] 

clientDatabase.count 

// so far so good 

/* 
add new client 
declare local variables in scene swift files where used 
*/ 
var firstName: String = "" 
var phone:String = "" 
var newPhone: String = "" 
var newFirstName: String = "" 
var newLastName: String = "" 
var newGroup: Int = 0 
// define struct using these input variables for values but with same keys as (global) clientDatabase 

struct newClientProfile { 

    var firstName: String = newFirstName 
    var lastName: String = newLastName 
    var group: Int = newGroup 
} 

// put newClientProfile into newClientDictionary 
var newClientDatabase:Dictionary = [String:newClientProfile]() 

// input values from scene - UITextFields 
newPhone = "4567890" 
newFirstName = "Super" 
newLastName = "Dave" 
newGroup = 14 

// test that all values are where they should be 
clientDatabase 
clientDatabase.count 
newClientDatabase = [newPhone:newClientProfile()] 
newClientDatabase.count 
// ok so far 

//the following line returns an error 
clientDatabase.append(newClientDatabase)  
// can't seem to append - error value of type '(String: clientProfile)' has no member 'append' 

ответ

2

две вещи. Прежде всего clientDatabase - это словарь, который не имеет append, вместо этого вам придется перебирать другой словарь и вставлять его элементы в clientDatabase.

Другая проблема заключается в том, что clientDatabase и newClientDatabase не являются аналогичными. Первый - [String : clientProfile], а второй - [String : newClientProfile]. Вам нужно будет преобразовать значения из одного типа в другой, чтобы объединить словари.

Глядя глубже в код, есть некоторые недоразумения в отношении языка. Например:

struct newClientProfile { 

    var firstName: String = newFirstName 
    var lastName: String = newLastName 
    var group: Int = newGroup 
} 

// put newClientProfile into newClientDictionary 
var newClientDatabase:Dictionary = [String:newClientProfile]() 

Вы создаете только для-структуру с целью содержит один набор значений, когда у вас уже есть clientProfile. Вместо этого вы могли бы сделать:

var newClientProfile = clientProfile(firstName: newFirstName, lastName: newLastName, group: newGroup) 

Это создаст переменную, которая является экземпляром clientProfile и хранит информацию, которую вы хотите. Однако у вас есть другие переменные, определенные как пустые значения.

Вот очищенная версия вашего кода, взгляните на нее и сообщите мне, если у вас есть какие-либо вопросы.

struct ClientProfile { // Convention is to use initial caps for enum, struct, class 
    let firstName: String 
    let lastName: String 
    let group: Int 
} 

var clientDatabase = [ 
    "1234567": ClientProfile(firstName: "Sally", lastName: "Sillious", group: 3), 
    "2345678": ClientProfile(firstName: "Sue", lastName: "Parker",group: 8), 
    "3456789": ClientProfile(firstName: "Bob", lastName: "Parker", group: 2), 
    "5678901": ClientProfile(firstName: "Jim", lastName: "Beam", group: 12) 
] 

// input values from scene - UITextFields 
let newPhone = "4567890" 
let newFirstName = "Super" 
let newLastName = "Dave" 
let newGroup = 14 

// define struct using these input variables for values but with same keys as (global) clientDatabase 
let newClientProfile = ClientProfile(firstName: newFirstName, lastName: newLastName, group: newGroup) 
let newClientDatabase = [newPhone:newClientProfile] 

for (phone,client) in newClientDatabase { 
    clientDatabase[phone] = client 
} 
+0

Thanks Kenneth, за ваш быстрый ответ. Я попробовал код, и он делает то, что мне нужно. И спасибо за ваши другие идеи. – user3784858