我有一个代表三角形的模型对象。有一些init方法采用已知的不同参数组合。然后它解决剩余的值(边长和角度)。目前,如果给定参数为零或超出此三角形类型的适当范围,则初始化程序返回nil。然而,为了向用户提供适当的反馈,控制器对象还必须检查不正确的输入值,例如角度>。 90度等。这对我来说很糟糕,因为这些规则应该只在模型中定义一次。所以我的想法是将一个NSError对象设置为控制器应该向用户显示的字符串。我只是不确定将此传达给控制器的最佳方式。如果发生错误,我的init方法是否应该返回此NSError而不是Triangle实例?这似乎是错的。或者我将指向NSError对象的指针作为init的参数传递,如果发生错误则填充它?如果我这样做,我仍然从三角形对象的init返回nil,因为它不可用或者我只是部分地初始化三角形并返回它?
答案 0 :(得分:2)
您应遵循其他Cocoa对象使用的相同约定,如Apple Error Handling Programming Guide中所述:
NSError**
作为方法的最后一个参数。NULL
,请使用NSError
对象填充该参数并返回nil
。init
方法,在返回[self release]
之前,您还应该nil
(除非您使用的是ARC)。答案 1 :(得分:1)
如果您需要详细的错误消息,请执行以下操作:
抛出异常。这正是它们的用途。
提供仅验证输入的方法,例如
+ (NSError *)errorFromValidationOfSide:(float)a size:(float)b;
在创建对象之前调用它。这样,您可以在内部共享任何验证代码,而不是在对象外部复制它。
让你的init
方法返回正确类型的工作对象以外的任何东西,正如您所怀疑的那样,是一个坏主意。在init上使用NSError指针是可以的,但对我来说似乎有点笨拙。