2

Is there a way to reduce code for repeat declarations in Obj-C?

E.g.:

I have

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

Can it be simplified to something like this?

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

Thanks!

4

2 回答 2

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];

文档


当然你可以写得更短:

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

现在它几乎和建议的语法一样紧凑。

于 2013-09-05T21:27:50.320 回答
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打字.timeZone

于 2013-09-05T20:52:33.540 回答