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

Objective C - Category No Visible selector @removeWhiteSpaceStringWithString

提问人:Axel 提问时间:4/11/2021 最后编辑:RobAxel 更新时间:4/12/2021 访问量:92

问:

所以我试图添加新的方法来使用 类别 进行测试,但是我必须通过以下步骤这样声明:NSString

  1. 从名称创建类别,所以它将是,之后我声明了我自己的返回类型是NSStringStringExtensionNSString+StringExtensionString

  2. 所以在我定义 in 和 之后,我尝试在我的 viewController 中调用它,但首先我导入了类NSString+StringExtension@interface@implementationNSString+StringExtension

  3. 在那之后,我确实喜欢这个

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

    “NSString”没有可见@interface声明选择器“removeWhiteSpaceStringWithString:”

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

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

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

有人和我一样有同样的情况吗?

目标-C nsstring 目标-c-类别

评论

2赞 Jim Rhodes 4/11/2021
你能在你的NSString+StringExtension.h文件中发布代码吗?

答:

3赞 Rob 4/11/2021 #1

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

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

评论

0赞 Axel 4/12/2021
嗨,@rob,很好!我不知道为什么我用 (+) 声明它,它解决了我的问题!非常感谢您的解决方案和解释。之前很困惑。保佑你!
0赞 Rob 4/12/2021
是的,扩展可以同时包含类方法和实例方法。也许你开始的例子是一个类方法。但在这种情况下,实例方法更有意义。祝你好运,祝你编码愉快