我可以减少重复声明中的代码吗?

时间:2013-09-05 20:38:58

标签: ios objective-c cocoa-touch

有没有办法减少Obj-C中重复声明的代码?

E.g:

我有

    localNotification.fireDate = self.dueDate;
    localNotification.timeZone = [NSTimeZone defaultTimeZone];
    localNotification.alertBody = self.text;
    localNotification.soundName = UILocalNotificationDefaultSoundName;

可以简化为这样的吗?

 localNotification
    .fireDate = self.dueDate;
    .timeZone = [NSTimeZone defaultTimeZone];
    .alertBody = self.text;
    .soundName = UILocalNotificationDefaultSoundName;

谢谢!

2 个答案:

答案 0 :(得分:6)

您可以使用键值编码。首先将值打包到字典中,并将属性名称作为键

NSDictionary *parameters = @{@"fireDate": self.dueDate,
                                 @"timeZone":[NSTimeZone defaultTimeZone],
                                 @"alertBody":self.text,
                                 @"soundName": UILocalNotificationDefaultSoundName }

,可以轻松枚举带有块的键和对象。

[parameters enumerateKeysAndObjectsUsingBlock: ^(id key, 
                                                 id object, 
                                                 BOOL *stop) 
{
    [localNotification setValue:object forKey:key];
}];

如果你一遍又一遍地使用这个代码,我会在NSNotification上创建一个类别,这个类别会占用字典并终止枚举。

比你可以简单地使用

[localNotification setValuesForKeysWithDictionary:parameters];

docs


当然你可以写得更短:

[localNotification setValuesForKeysWithDictionary:@{@"fireDate": self.dueDate,
                                                    @"timeZone":[NSTimeZone defaultTimeZone],
                                                    @"alertBody":self.text,
                                                    @"soundName": UILocalNotificationDefaultSoundName }];

现在它几乎与提议的语法一样紧凑。

答案 1 :(得分:2)

唯一的方法是声明一个采用您想要设置的参数的方法。

-(void)notification:(UILocalNotification *)notification setFireDate:(NSDate *)date
   setAlertBody:(NSString *)alertBody {

   notification.fireDate = date;
   notification.alertBody = alertBody;
   notification.timeZone = [NSTimeZone defaultTimeZone];
   notification.soundName = UILocalNotificationDefaultSoundName; 
}

可以考虑将后两行设置为“默认”。将这些行更改为您想要的默认值。然后...

UILocalNotification *myNotification = ...
NSDate *tenMinutesAway = [NSDate ... 
[self notification:myNotification setFireDate:tenMinutesAway setAlertBody:@"Hello world!"];

您还可以查看子类UILocalNotification并在-init方法中设置一堆默认行为,这样可以省去您必须输入.soundName和{{1}再次