【问题标题】:Is using respondsToSelector: good style?正在使用 respondsToSelector: 好风格吗?
【发布时间】:2010-10-02 21:37:42
【问题描述】:

发送消息并希望对象响应,或者检查它是否响应选择器并在没有响应时进行某种回退是否是“更好的方式”。

例如:

- (NSString *)stringForObjectValue:(id)obj {
    if ([obj respondsToSelector:@selector(intValue)]) {
        NSString *roman = [self formatRomanNumber:[obj intValue] resultSoFar:@""];
        return roman;
    } else {
        return [NSString stringWithFormat:@"can't format a %@", [obj class]];
    }
}

对比

- (NSString *)stringForObjectValue:(id)obj {
    NSString *roman = format_roman(@"", [obj intValue]);
    return roman;
}

(示例来自 NSNumberFormatter 子类...但它可能来自 NSObjectFormatter 子类...)

【问题讨论】:

    标签: objective-c coding-style


    【解决方案1】:

    如果您不能 100% 确定到达 (stringForObjectValue) 函数的所有实例都会响应选择器,那么您必须执行该检查以避免运行时崩溃。

    obj 不响应intValue 选择器时如何处理可能取决于使用您的方法的特定上下文。例如,在这种情况下,您可能会从方法中返回 nil 对象,这样您就可以很容易地看到出错了

    【讨论】:

      【解决方案2】:

      如果您不知道确切的类型,那么使用respondsToSelector: 绝对是一种不错的风格,否则您将面临异常的风险。这种技术的名称非常重要:Duck Typing

      【讨论】:

        猜你喜欢
        • 2010-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多