Return 发送到 nil 的方法不是 nil
Return something other than nil from a method sent to nil
这对于一个类别来说可能是不可能的,但为了以防万一它是可行的,我想找出答案。
我在 NSString
上写了一个类别,我有一个类别方法可以将逗号分隔的字符串解析为 NSArray
清理多余的逗号和空格,并修剪结尾...等等比类似功能的内置方法全面。不过问题来了……如果字符串是 nil
怎么办?有什么办法可以 return 初始化 NSArray
与 0 个对象而不是 returning nil
?
场景会是这样的...
NSArray *parsed = [someString parseStringIntoArray];
...假设 someString
是 nil
。我能以某种方式从中得到一个初始化数组吗?
显然有很多方法可以解决这个问题,但要保持简洁明了,并使用类别方法...这可能吗?
没有。但是,是的,如果您进行一些更改:
因为你调用的是实例方法,所以这行不通。当您向 nil
发送消息(也就是调用 nil 对象的方法)时,您将始终收到 nil
。
这就是 nil 本身的关键概念。
例如,您可以添加一个 class 方法,然后在此 class 方法中,您可以针对 nil
和 return 测试一个空数组:
+ (NSArray *)parseStringIntoArray:(NSString *)string {
return [string componentsSeparatedByString:@","] ?: @[];
}
或者您可以简单地使用 NSString
内置的内容:
NSArray *parts = [@"foo,bar,la,le,lu" componentsSeparatedByString:@","] ?: @[];
编辑
不,无法从发送到 nil
的消息中 return 任何内容。这是融入运行时的核心:objc_msgSend()
is responsible for this behavior。
如果接收者是 nil
,objc_msgSend()
将表达式解析为方法的 return 类型的适当 0 值。
您必须在之前或之后测试 nil
并手动更改数组的值。
(顺便说一下,这是一个类别方法这一事实是无关紧要的。)
这对于一个类别来说可能是不可能的,但为了以防万一它是可行的,我想找出答案。
我在 NSString
上写了一个类别,我有一个类别方法可以将逗号分隔的字符串解析为 NSArray
清理多余的逗号和空格,并修剪结尾...等等比类似功能的内置方法全面。不过问题来了……如果字符串是 nil
怎么办?有什么办法可以 return 初始化 NSArray
与 0 个对象而不是 returning nil
?
场景会是这样的...
NSArray *parsed = [someString parseStringIntoArray];
...假设 someString
是 nil
。我能以某种方式从中得到一个初始化数组吗?
显然有很多方法可以解决这个问题,但要保持简洁明了,并使用类别方法...这可能吗?
没有。但是,是的,如果您进行一些更改:
因为你调用的是实例方法,所以这行不通。当您向 nil
发送消息(也就是调用 nil 对象的方法)时,您将始终收到 nil
。
这就是 nil 本身的关键概念。
例如,您可以添加一个 class 方法,然后在此 class 方法中,您可以针对 nil
和 return 测试一个空数组:
+ (NSArray *)parseStringIntoArray:(NSString *)string {
return [string componentsSeparatedByString:@","] ?: @[];
}
或者您可以简单地使用 NSString
内置的内容:
NSArray *parts = [@"foo,bar,la,le,lu" componentsSeparatedByString:@","] ?: @[];
编辑
不,无法从发送到 nil
的消息中 return 任何内容。这是融入运行时的核心:objc_msgSend()
is responsible for this behavior。
如果接收者是 nil
,objc_msgSend()
将表达式解析为方法的 return 类型的适当 0 值。
您必须在之前或之后测试 nil
并手动更改数组的值。
(顺便说一下,这是一个类别方法这一事实是无关紧要的。)