SWIFT将数据附加到字典

时间:2016-02-28 00:04:37

标签: swift dictionary append

我在编写一个看似简单的任务时遇到了麻烦。我想将新的客户端配置文件数据添加到客户端配置文件字典(clientDatabase)但不断收到错误 - 似乎无法附加 - 错误:类型'(String:clientProfile)'的值没有成员'append'(请参阅错误代码底部)

非常感谢您提供的任何见解。

谢谢, 比尔

//: 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'

1 个答案:

答案 0 :(得分:2)

两件事。首先,clientDatabase是一个没有append的字典,而是您必须遍历另一个字典并将其元素插入clientDatabase

另一个问题是clientDatabasenewClientDatabase的类型不同。第一个是[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
}