私のtableViewControllerには、この種のコードがあります(ここでは簡略化されています):
-(void)saveOnDatabase{
//here I set up NSManagedObjectContext and everything
[[[array objectAtIndex:1] objectForKey:@"tableLabels"] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop){
if (obj==solvent) {
[pepe setValue: [self numberFromText:delta :2] forKey:obj];
}else {
[pepe setValue: nil forKey:obj];
}
}];
}
それは正常に動作し、私が期待したことを行います。ただし、コードをクリーンに保つために、NSObject のサブクラスであるモデルからこのコードを実行し、すべての計算と UI とは関係のないすべてのことを行います。問題は、モデル Class に実装しようとすると、次のようなエラーが発生することです。Incompatible block pointer types sending 'int((^))(void)' to parameter of type 'void (^)(__strong id, NSUInteger, BOOL*)'
ブロックは次のようなメソッド内に含まれています。
-(void)saveCustomToDatabase:id withContext:(NSManagedObjectContext*)context withImpurity:(NSString*)impurity withDelta:(NSString *)delta ... // the rest
必要なすべてのパラメーターを渡すことを考慮して、ここで何が行われているのか、なぜ他のクラスでコンパイルされないのかはよくわかりません...
完全な方法はまさにこれです:
-(void)saveCustomToDatabase:id withContext:(NSManagedObjectContext*)context withImpurity:(NSString*)impurity withDelta:(NSString *)delta withAssigment:(NSString*)assigment withEntity:(NSString*)entity withSolvent:(NSString*)solvent {
NSManagedObject *pepe = [NSEntityDescription insertNewObjectForEntityForName:entity inManagedObjectContext:context];
if (assigment.length>1) [pepe setValue:assigment forKey:@"definition"];
[pepe setValue:impurity forKey:@"impurity"];
[[[[self pickerArray] objectAtIndex:1] objectForKey:@"tableLabels"] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop){
if (obj==solvent) {
[pepe setValue: [self numberFromText:delta :2] forKey:obj];
}else {
[pepe setValue: nil forKey:obj];
}
}];
NSError *error;
if (![context save:&error])
{
NSLog(@"Problem saving: %@", [error localizedDescription]);
}
}