我编写了一个在对象内部工作的方法,但现在我想提取它以使它只是一个函数。这是我破坏的命令行工具程序:
#import <Foundation/Foundation.h>
+ (NSMutableString *)reverseString:(NSString *)originalString {
NSMutableString *reversedString = [[NSMutableString alloc] init];
for (NSInteger i = originalString.length; i > 0; i--) {
[reversedString appendFormat:@"%c", [originalString characterAtIndex:i-1]];
}
return reversedString;
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSString *originalString = @"original string";
NSMutableString *newString = [reverseString:originalString];
NSLog(@"Reversed string: %@", newString);
}
return 0;
}
我的问题是,如何从main()
调用reverseString方法?我不认为我正确地定义它。我是否也必须申报?我知道我的方法的内容工作正常,但我不知道如何以允许main看到它的方式定义它。
答案 0 :(得分:4)
根据定义,“方法”是类的一部分。有两种类型,实例方法和类方法。要调用实例方法,您需要一个类的实例。要调用类方法,您不需要实例。您可以直接在类上调用它。
相比之下,还有“功能”。您不需要实例或类来调用函数。
所以,听起来你想要一个功能。函数是Objective-C从C继承的函数。函数的语法与方法的语法不同。以下是使用函数查看代码的方式:
NSMutableString* reverseString(NSString *originalString) {
NSMutableString *reversedString = [[NSMutableString alloc] init];
for (NSInteger i = originalString.length; i > 0; i--) {
[reversedString appendFormat:@"%c", [originalString characterAtIndex:i-1]];
}
return reversedString;
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSString *originalString = @"original string";
NSMutableString *newString = reverseString(originalString);
NSLog(@"Reversed string: %@", newString);
}
return 0;
}
顺便说一下,你的代码“工作正常”。你不能通过它所谓的“字符”迭代字符串,并将它们全部视为独立的。 NSString
调用“字符”实际上是UTF-16代码单元。并非所有Unicode字符都可以表示为单个UTF-16代码单元。有些人需要在所谓的代理对中使用两个代码单元。如果你拆分并反转一个代理对,你将得到一个无效的字符串。
作为一个单独的问题,Unicode具有组合标记。例如,“é”可以表示为U + 0065 LATIN SMALL LETTER E,然后是U + 0301 COMBINING ACUTE ACCENT。同样,如果您重新排序这些“字符”,则重音将与不同的字符组合(或者根本无法合并)。
迭代字符串的组合字符序列的正确方法是使用-[NSString enumerateSubstringsInRange:options:usingBlock:]
方法和NSStringEnumerationByComposedCharacterSequences
选项。
答案 1 :(得分:1)
通过“我想提取它以使它只是一个函数”你隐含地说“我想要一个C风格的函数,而不是一个Objective-C类方法”。 C风格的函数被声明和调用不同(责备历史)。
<span class="first"><input type="text" /></span><input class="second" type="text" />
body {
padding: 50px;
background: #333;
}
* {
box-sizing: border-box;
}
input {
background: white;
border: none;
padding-left: 15px;
}
.first {
position: relative;
}
.first:before {
content: "/";
position: absolute;
left: 100%;
top: 0;
height: 100%;
transform: translateX(-50%);
font-size: 18px;
}