从发送到nil的方法返回除nil之外的其他内容

时间:2015-12-10 22:58:10

标签: objective-c null nsstring message-passing

对于某个类别,这可能是不可能的,但为了防止它变得可行,我想找出答案。

我在NSString上写了一个类别,我有一个类别方法,用逗号分隔的字符串解析为NSArray清理额外的逗号和空格,并修剪结尾......所以比类似功能的内置方法。虽然如此,如果字符串是nil怎么办?有什么方法可以返回带有0个对象的初始化NSArray而不是返回nil吗?

场景将会是这样的......

NSArray *parsed = [someString parseStringIntoArray];

...假设someStringnil。我可以以某种方式获得一个初始化的数组吗?

显然有办法解决这个问题,但要保持清洁和简洁,并使用类别方法......是否可能?

2 个答案:

答案 0 :(得分:2)

没有。但是,是的,如果你做了一些改变:

由于您调用实例方法,因此无法正常工作。当您向nil发送消息(也就是在nil对象上调用方法)时,您将始终获得nil。 这是nil本身的关键概念。

您可以添加一个类方法,然后在此类方法中,您可以针对nil进行测试并返回一个空数组:

+ (NSArray *)parseStringIntoArray:(NSString *)string {
    return [string componentsSeparatedByString:@","] ?: @[];
}

或者您可以简单地使用NSString内置的内容:

NSArray *parts = [@"foo,bar,la,le,lu" componentsSeparatedByString:@","] ?: @[];

修改

答案 1 :(得分:1)

不,没有办法从发送到nil的邮件中返回任何内容。这是运行时的核心:objc_msgSend() is responsible for this behavior

如果接收方为nilobjc_msgSend()将表达式解析为方法返回类型的相应0值。

您必须在之前或之后测试nil并手动更改数组的值。

(顺便说一句,这是一种类别方法的事实是无关紧要的。)