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

问题描述

所以我试图添加方法来使用 Nsstring 中的类别进行测试,但我必须通过以下步骤声明如下:

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

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

  3. 之后我就喜欢这个

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

    没有可见的@interface for 'Nsstring' 声明了选择器 'removeWhiteSpaceStringWithString:'

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

所以我找到了这种方式,但我不知道这是要使用的正确代码吗?

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

有和我一样的情况吗?

解决方法

根据您与我们分享的内容,您似乎定义了一个类方法(使用 +)。它应该是一个实例方法(带有 -),然后你也不需要参数。您可以简单地引用 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

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...