Objective-C Noob:如何在main中定义+调用方法?

时间:2015-06-20 17:06:34

标签: objective-c

我编写了一个在对象内部工作的方法,但现在我想提取它以使它只是一个函数。这是我破坏的命令行工具程序:

#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看到它的方式定义它。

2 个答案:

答案 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;
}