Ios 是否可以枚举NSDictionary键来设置数据模型成员值?
我有一本字典(例如) 我有一个数据模型,具有以下内容:Ios 是否可以枚举NSDictionary键来设置数据模型成员值?,ios,swift,core-data,Ios,Swift,Core Data,我有一本字典(例如) 我有一个数据模型,具有以下内容: @interface Person : NSManagedObject @property (nonatomic, retain) NSString * Name; @property (nonatomic, retain) NSString * Lastname; 我可以枚举字典所有键来设置数据模型成员值吗 大概是这样的: let newPerson = CoreDataHelper.insertManagedObject(NSStr
@interface Person : NSManagedObject
@property (nonatomic, retain) NSString * Name;
@property (nonatomic, retain) NSString * Lastname;
我可以枚举字典所有键来设置数据模型成员值吗
大概是这样的:
let newPerson = CoreDataHelper.insertManagedObject(NSStringFromClass(Person), managedObjectContext: self.moc) as! Person
for key in self.newPersonDict!.allKeys {
newPerson.key = self.newPersonDict!.objectForKey(key)
}
let newPerson = CoreDataHelper.insertManagedObject(NSStringFromClass(Person), managedObjectContext: self.moc) as! Person
for key in self.newPersonDict!.allKeys {
newPerson.setValue(self.newPersonDict!.valueForKey(key), forKeyPath: key)
}
谢谢,
Max正如其中一条评论所说,您可以通过反射来实现这一点。也许有更好的方法可以做到这一点,但这里有一个关于如何做到这一点的示例
class YourClass : NSObject {
func getKeys() -> Array<String> {
let mirror = reflect(self)
var keys = [String]()
for i in 0..<mirror.count {
let (name,type) = mirror[i]
keys.append(name)
}
return keys
}
func getObjectForKey(key: String) -> AnyObject? {
return self.valueForKey(key)
}
}
classyourclass:NSObject{
func getKeys()->数组{
让镜子=反射(自我)
变量键=[String]()
对于0中的i..任何对象{
返回self.valueForKey(键)
}
}
您仍然需要将任何对象?强制转换为您的特定类型,并且要小心,valueForKey在使用未知键调用时可能会导致异常。如其中一条评论所述,您可以通过反射来实现这一点。可能有更好的方法来实现这一点,但下面是一个如何实现的示例
class YourClass : NSObject {
func getKeys() -> Array<String> {
let mirror = reflect(self)
var keys = [String]()
for i in 0..<mirror.count {
let (name,type) = mirror[i]
keys.append(name)
}
return keys
}
func getObjectForKey(key: String) -> AnyObject? {
return self.valueForKey(key)
}
}
classyourclass:NSObject{
func getKeys()->数组{
让镜子=反射(自我)
变量键=[String]()
对于0中的i..任何对象{
返回self.valueForKey(键)
}
}
您仍然需要将任何对象强制转换为您的特定类型,并且要小心,valueForKey在使用未知键调用它时可能会导致异常。您可以使用func setValuesForKeysWithDictionary(\ukeyedValues:[NSObject:AnyObject])您可以使用func setValuesForKeysWithDictionary(\ukeyedValues:[NSObject:AnyObject]))试试这样的方法:
let newPerson = CoreDataHelper.insertManagedObject(NSStringFromClass(Person), managedObjectContext: self.moc) as! Person
for key in self.newPersonDict!.allKeys {
newPerson.key = self.newPersonDict!.objectForKey(key)
}
let newPerson = CoreDataHelper.insertManagedObject(NSStringFromClass(Person), managedObjectContext: self.moc) as! Person
for key in self.newPersonDict!.allKeys {
newPerson.setValue(self.newPersonDict!.valueForKey(key), forKeyPath: key)
}
试着这样做:
let newPerson = CoreDataHelper.insertManagedObject(NSStringFromClass(Person), managedObjectContext: self.moc) as! Person
for key in self.newPersonDict!.allKeys {
newPerson.key = self.newPersonDict!.objectForKey(key)
}
let newPerson = CoreDataHelper.insertManagedObject(NSStringFromClass(Person), managedObjectContext: self.moc) as! Person
for key in self.newPersonDict!.allKeys {
newPerson.setValue(self.newPersonDict!.valueForKey(key), forKeyPath: key)
}
你可以通过反射来实现这一点,但我建议你不要这样做。相反,你应该为
Person
创建一个initWithAttributes:
初始化器,显式地分配每个属性。一些旁注:1)你的字典混淆了;你可能希望Name
和LastName
作为键,而不是值属性名的默认名称是camelCase,而不是大写。3)Name
和Lastname
在一起没有真正意义;您可能应该拥有GivenName
和FamilyName
或者仅仅是Name
本身,这取决于您的用例。试试newPerson.setValue(self.newPersonDict!.valueForKey),forKeyPath:key)
@Nishant:谢谢。如果你回答了这个问题,我会接受并投票。谢谢。@masgar:谢谢。我已经添加了我的评论作为答案。你可以通过反射来做这件事,但我建议你不要这样做。相反,你应该为人创建一个显式分配每个属性的initWithAttributes:
初始值设定项。A一些旁注:1)你的字典混淆了;你可能想要Name
和LastName
作为键,而不是值。2)属性名的约定是camelCase,而不是大写。3)Name
和LastName
在一起没有意义;你可能应该有GivenName
和FamilyName
或只是名称本身,这取决于您的用例。请尝试newPerson.setValue(self.newPersonDict!.valueForKey(key),forKeyPath:key)
@Nishant:谢谢。如果您回答问题,我将接受并投票。谢谢。@masgar:谢谢。我已经添加了我的评论作为答案。