Tag: design patterns

Swift中面向协议的构建器模式

我是用于创建和验证模型的Builder设计模式的狂热用户。 为什么? 它使模型创建变得非常简单。 让用户:用户? = UserBuilder() .set(field:.firstName(“ Matt”)) .set(field:.lastName(“ Hoffman”)) .set(字段:.username(“ mhoffman”)) 。建立() 创建模型时,我通常不知道所传递的值是否有效。 因此,我不能简单地创建模型。 在创建模型以验证字段之前,我必须编写很多逻辑。 如果习惯于在模型外部(即在控制器中)编写此验证,则将发现您重复了代码,并且出于速度考虑,可能会错过错误情况。 模型不是只在一个地方创建的。 它们是从网络请求中读取JSON时创建的,在各种视图中,当您根据用户输入创建模型以在应用程序的其他部分中使用时,这会留出很大的出错空间。 构建器模式解决了重复代码的问题,但是仍然需要您仔细考虑在build()阶段进行的所有验证。 为每个字段编写每个set()函数非常繁琐。 如果我告诉您有人花了几天时间使Builder模式更易于实现,并且更容易包含模型所需的所有验证逻辑,该怎么办? 这是您的幸运日! 老路 假设您有一个UserSignUp对象,该对象具有字段firstName , lastName , username , password , confirmPassword ,其中lastName不是必需的。 这就是我以前编写“构建器模式”的方式: 上面的方法是干净且可行的。 如果您不熟悉Builder模式,请继续使用它! 接下来我将要描述的面向协议的方式实际上需要更多代码,但最终会使验证逻辑更加清晰,当添加新字段时,编译器将警告您尚未通过验证功能处理的验证案例。枚举。 新方法 而已! 如您所见,在面向协议的构建器模式中肯定有更多的代码,而不是简单地创建一个自定义的构建器,而没有为每个模型重用代码。 但是,每当您将字段添加到面向协议的模式时,如果您不指定字段的验证和isRequired,编译器都会抱怨。 此外,通过这种方法,可以很清楚地在何处添加模型的验证逻辑。 最后,代码重用是很好的,并且如果需要添加其他方法进行验证,那么它可以为所有构建者使用! 该你了 现在,如果您喜欢我在Swift中使用Builder模式的方法,那么恳请您在项目中使用它并获得回报。 然后,当您遇到改进时,请告诉我! 否则,如果您认为我的工作过于复杂,并且您有另一种方法,或者您只是比我更了解Swift并且可以改进此代码,那么我希望收到反馈。 TL; DR 使用构建器模式使模型在Swift中变得强大。 我做了一个面向协议的实现,您可以在这里找到。

什么是最好的方式发送参数到UIViewController?

我问这个问题,因为它看起来viewDidLoad在初始化器的主块之前被调用,并且我在初始化器中初始化的类variables在viewDidLoad中调用nil。 为了您的参考,我以编程方式完成这个viewcontroller,我已经创build了一个自定义的初始化,所以我可以采取各种参数在我的viewcontroller中使用。 我的自定义初始化器当然调用UIViewControllers指定的初始化器。 基本上,我很好奇什么是正确的devise模式发送参数到UIViewController? 我读过关于这个的其他线程,并没有真正得到一个明确的答案。 我应该跳过初始化并手动(从课外)设置属性? 这似乎有点不爽,我真的想发送一些参数,并好奇别人如何去做这个?

是否可以在目标C中为静态variables设置KVO通知?

我有类A,实例variables从caching的数据派生的属性,这个caching的数据被表示为一个单身,是A(它本质上是一个NSDictionary)的一部分。 不时,这个caching被修改。 发生这种情况时,我想让所有A实例在下次访问属性时从caching中提取新信息,或换句话说,使其属性内容无效。 到目前为止,手动通知每个实例(使用静态数组来跟踪成员)。 我不是粉丝。 通知中心可能有一个选项,但我宁愿尝试使用KVO。 有没有人设法订阅iOS上的类variables的KVO变化? (换句话说,使用来自A的静态variables的更改来告诉A实例刷新其数据。) 换句话说,我很想拥有 static void* context = &context; static myHadHocObject* msignal; 并在稍后的A类代码 [msignal addObserver:self forKeyPath:@"operation" options:NSKeyValueObservingOptionNew context:context]; 并通过一个类实例通知msignal的变化 -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{ } 我试过使用各种专门的课程,没有运气。 似乎我失去了一些东西。 指针是受欢迎的,谢谢!

处理第三方API时,正确的系统devise是什么?

Joubert的这篇博文只是睁开了眼睛。 我已经处理了很多Java和其他语言的devise模式。 但Objective-C是一种相当独特的语言。 假设我们在一个项目中使用Dropbox或Facebook等第三方API。 到目前为止,我一直在做的就是把所有与第三方API有关的东西整合到一个单独的类中。 所以我可以从我的视图控制器中的任何地方访问这个类。 我可以举个例子: [[DropboxModel sharedInstance] uploadFile:aFile] 然而正如博客文章所指出的那样,这样做效率不高,导致意大利面代码和unit testing不合格。 那么devise系统的最好方法是什么,以便模块化和易于使用?