Objective C - 类别无可见选择器 @removeWhiteSpaceStringWithString

Objective C - Category No Visible selector @removeWhiteSpaceStringWithString

所以我正在尝试使用 NSString 中的类别添加新的测试方法,但我必须通过以下步骤声明一些方法:

  1. NSString 创建类别,名称为 StringExtension 所以它将是 NSString+StringExtension,之后我声明了我自己的方法 return 类型是String

  2. 所以在 NSString+StringExtension @interface@implementation 中定义之后,我尝试在 viewController 中调用它,但首先我导入classNSString+StringExtension

  3. 之后我喜欢这个

    NSString *testString = @"as d a s d";
    NSLog(@"===== %@", [testString removeWhiteSpaceStringWithString:testString]);
    
  4. 它说

    No visible @interface for 'NSString' declares the selector 'removeWhiteSpaceStringWithString:'

问题是,为什么不能这么用?我已经搜索并看到了这样做的教程,而且这是可能的,但为什么我不能那样做?

所以我找到了这个方法,但我不知道这个代码是否正确?

NSLog(@"===== %@", [[testString class] removeWhiteSpaceStringWithString:testString]);

有和我一样的情况吗?

根据您与我们分享的内容,您似乎定义了一个 class 方法(使用 +)。它应该是一个实例方法(-),然后你也不需要参数。您可以简单地参考 self.

例如:

//  NSString+Whitespace.h

@import Foundation;

NS_ASSUME_NONNULL_BEGIN

@interface NSString (Whitespace)

- (NSString *)stringByRemovingWhitespace;

@end

NS_ASSUME_NONNULL_END

//  NSString+Whitespace.m

#import "NSString+Whitespace.h"

@implementation NSString (Whitespace)

- (NSString *)stringByRemovingWhitespace {
    return [self stringByReplacingOccurrencesOfString:@"\s+"
                                           withString:@""
                                              options:NSRegularExpressionSearch
                                                range:NSMakeRange(0, self.length)];
}

@end

那么你可以这样做:

NSString *testString = @"as d a s d";
NSLog(@"===== %@", [testString stringByRemovingWhitespace]);  // ===== asdasd

显然,在您的实现中做任何您想做的事,但它说明了您想要一个实例方法并且不需要再次将字符串作为参数传递的想法。