SWIFT将数据附加到字典中

问题描述:

我无法编码一个看似简单的任务。我想将新的客户端配置文件数据添加到客户端配置文件字典(clientDatabase),但不断收到错误 - 似乎无法追加 - error: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' 

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

另一个问题是clientDatabasenewClientDatabase不是相同的类型。第一个是​​,第二个是[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]() 

你正在创建一个struct只是包含一组值,当你已经有了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

感谢Kenneth,感谢您的快速回复。我尝试了代码,它做我需要的。并感谢您的其他见解。 – user3784858