Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 是否可以枚举NSDictionary键来设置数据模型成员值?_Ios_Swift_Core Data - Fatal编程技术网

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:谢谢。我已经添加了我的评论作为答案。