如果尚未定义,则定义Objective-C类别函数

时间:2015-02-14 22:18:17

标签: objective-c ios8

iOS 8引入containsStringNSString,检查接收器是否包含子字符串。它不如写[myString rangeOfString:@"substring"].location == NSNotFound那么笨拙。我想在NSString上编写一个类别,为iOS 7及更低版本定义containsString。我有两个条件来定义它:

  1. 我不想通过命名我的函数[customPrefix]ContainsString来获得便宜的出路。我的目标是避免尴尬,而不必考虑两个containsString函数。
  2. 我不想覆盖iOS 8的实现,因为它可能被编写为比我的更有效地运行。它也可能在未来的iOS版本中升级以处理新技术(例如iOS 5引入ARC时发生的事情)
  3. 这就是我认为代码类似的东西:

    @implementation NSString (utility)
    
    #if MAGIC_MACRO_CONTAINS_STRING_NOT_DEFINED
    - (BOOL)containsString:(NSString*)substring 
    {
        return [self rangeOfString:substring].location != NSNotFound;
    }
    #endif
    
    @end
    

1 个答案:

答案 0 :(得分:1)

为您的类别方法提供您自己的唯一名称。如果新的containsString存在,请将其写为rangeOfString,如果不存在则为- (BOOL)myContainsString:(NSString*)substring { if ([self respondsToSelector:@selector(containsString:)]) { return [self containsString:substring]; } else { return [self rangeOfString:substring].location != NSNotFound; } }

无法有条件地实施类别方法,这就是您应该使用自己的名称创建类别方法的原因。并且您不能使用编译器指令宏,因为它们在编译时工作,而不是运行时。

[someString myContainsString:someSubstring]

现在您在所有代码中使用{{1}}。