提问人:Axel 提问时间:4/11/2021 最后编辑:RobAxel 更新时间:4/12/2021 访问量:92
目标 C - 类别 无可见选择器 @removeWhiteSpaceStringWithString
Objective C - Category No Visible selector @removeWhiteSpaceStringWithString
问:
所以我试图添加新的方法来使用 类别 进行测试,但是我必须通过以下步骤这样声明:NSString
从名称创建类别,所以它将是,之后我声明了我自己的返回类型是
NSString
StringExtension
NSString+StringExtension
String
所以在我定义 in 和 之后,我尝试在我的 viewController 中调用它,但首先我导入了类
NSString+StringExtension
@interface
@implementation
NSString+StringExtension
在那之后,我确实喜欢这个
NSString *testString = @"as d a s d"; NSLog(@"===== %@", [testString removeWhiteSpaceStringWithString:testString]);
它说
“NSString”没有可见@interface声明选择器“removeWhiteSpaceStringWithString:”
问题是,为什么它不能这样使用?我已经搜索并看到教程这样做了,而且它是可能的,但是为什么我不能这样做呢?
所以我找到了这种方式,但我不知道这是正确的代码吗?
NSLog(@"===== %@", [[testString class] removeWhiteSpaceStringWithString:testString]);
有人和我一样有同样的情况吗?
答:
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
是的,扩展可以同时包含类方法和实例方法。也许你开始的例子是一个类方法。但在这种情况下,实例方法更有意义。祝你好运,祝你编码愉快
评论