书中The Pragmatic Programmer ,作者建议所有方法输入都应该经过验证。这样可以尽早发现方法中的问题并轻松追踪其来源。
在我的 Mac 应用程序中,我通过创建一个 Assert
类来完成此操作。这个类有几个类方法。这些方法确定是否满足某些先决条件,如果不满足,则抛出异常。典型的断言可能如下所示:
-(void) setWidth: (int) theWidth {
[Assert integer: width isGreaterThanInteger: 0];
width = theWidth;
}
这非常有效,并且显着减少了我花在寻找错误上的时间。然而,我最近注意到一些断言方法作为谓词非常有用。例如,我的 integer:isGreaterThanInteger:andLessThanInteger:
和我的 stringIsNotEmpty:
方法同样有用。为此,我创建了第二个类 Predicate
,其中填充了几个更有用的谓词方法。因此,我从断言方法中获取逻辑,并将其移至 Predicate
中,然后重写我的 Assert
方法,如下所示:
if ![Predicate predicateMethod]
throw exception
这已经变成了一场维护噩梦。如果我在 Predicate
中更改方法名称,我还必须在 Assert
中更改它以保持一致。如果我更新 Assert
方法的文档,那么我必须对 Predicate
方法执行相同的操作。
理想情况下,我希望重建 Assert
类,以便在对其调用任何方法时,它会拦截选择器。然后可以检查 Predicate 类以查看它是否响应选择器,如果响应,则使用传递到 Predicate 的相同参数在 Predicate 上调用该方法。 断言
方法。如果 Predicate
方法返回 false,则会引发异常。
有没有办法在 Objective-C 中做到这一点?
谢谢。
最佳答案
您可以使用-forwardingTargetForSelector:
简单地将方法转发到另一个对象,但如果您想要高级行为(例如检查返回值以查看它是否为 false),您可能需要使用 -forwardInvocation:
。 (但是,请注意,文档说这比前一个选项“昂贵得多”。)
关于objective-c - Objective-C 中的动态方法创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7185122/