比传递NSDictionaries更好的模式作为参数?

Shi*_*zam 6 macos model-view-controller design-patterns objective-c ios

随着我们的代码库的成熟,我开始不喜欢将字典作为一种方法来传递消息传递的信息,或者更糟糕的是函数参数.它需要发送和接收功能都具有未记录的字符串文字API.

..in some function..
NSDictionary *info = [NSDictionary dictionaryWithObjectsAndKeys:
                         thisObject, @"thisKey",
                         thatObject, @"thatKey",
                         nil];

[[NSNotificationCenter defaultCenter] postNotificationName:@"MY_NOTIFICATION" object:nil userInfo:info];
....
Run Code Online (Sandbox Code Playgroud)

然后在someClass听众

- (void)someClassListener:(NSNotification *)notification {
    NSDictionary *info = [notification userInfo];

    ThisObject *ob1 = [info objectForKey:@"thisKey"];
    ThatObject *ob2 = [info objectForKey:@"thatKey"];
}
Run Code Online (Sandbox Code Playgroud)

你必须记住它thisKey并且thatKey是类型的键,ThisObject并且ThatObject对于那个通知,确定你可以为某些键创建一些常量,但这并不能真正解决问题.

并且假设你有一个需要15个参数的函数,你不打算用15个参数创建一个函数,只是传递一个字典会更容易(虽然不太可读)但现在你遇到了与上面相同的问题.

我在这些类的头文件中创建了"消息类"(即一个标题中的两个接口),而消息类只是一个对象列表,您定义并发送给方法,这会创建一个更强的契约,但这感觉错误.

这将会是巨大的,如果我可以做类似typeDef的报头参数对象,但不支持NSObject的唯一的东西,喜欢intfloat等.

本质上我正在尝试在消息发送者和消息接收者之间创建一个更强大的契约,即函数或通知.

rma*_*ddy 4

您可以为键定义常量。作为示例,请参阅文档中的示例UIKeyboardDidShowNotification。有一个指向所有可用于获取有关通知信息的键的链接。

更好的方法是将数据封装到类而不是字典中。创建一个带有属性的简单类。这将比字典更具自我记录性。您可以在 .h 文件中看到属性名称和属性类型。

如果您发现有需要 15 个参数的方法,则需要退一步并将这些参数封装到适当的类中。也许该方法适当地减少为几个参数和一个类或类似的东西。