【问题标题】:Objective C question: method won't return a stringObjective C 问题:方法不会返回字符串
【发布时间】:2011-05-22 13:32:15
【问题描述】:

这是我的第一个问题,如果很明显,请原谅我。几年前我学会了用 Pascal 编程,所以我的术语可能不合适。我查看了一堆帖子,但似乎没有解决我的基本问题。

我有一个查找表,用于将小数转换回分数。我正在调用这个方法...

-(void) convertToFractions:(float *)float2 aString:(NSMutableString *) myString;

...用这个..

[self convertToFractions:&float1 aString:outputFraction]; 

这个想法是float2 是我传递给方法的小数,myString 是返回的分数。

这在查找之后运行:

myString = [NSString stringWithString:[[decimalInchArray objectAtIndex:x]objectAtIndex:1]];
NSLog(@"myString = %@",myString);

日志显示myString 是正确的分数,即myString 正确显示了我想要返回的分数,但outputFraction 为空。

我认为这是一个指针问题。我试过*myString,但是编译器抛出错误(不兼容的类型)。

非常感谢任何建议。

【问题讨论】:

  • 欢迎来到 SO,@Jeremy,请在发布时格式化您的代码。另外,不要忘记选择对您有帮助的答案。
  • 虽然这一切都是可以解决的,但请帮自己一个忙,拿一本好的 Objective-C 入门书。
  • 顺便说一句:您的字符串不会更改,因为您为传递的变量分配了一个新字符串,而不是更改其内容。
  • @Eiko 是对的,请参阅下面的可能方法的快速概述。这是一个很好的阅读参考developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/…

标签: objective-c pointers parameters methods nsmutablestring


【解决方案1】:

您想将convertToFractions 方法的输出从void 更改为NSString。 它返回 null 因为你的方法的返回类型是 void,所以它什么也不返回。

Objective-C 方法的返回类型在括号中,在方法名称的开头。

这里是一个例子,但我看不到你在哪里定义 convertToString 所以,我将使用伪代码。

- (NSString *) convertToFractions:(float *)float2{
  NSString *fraction = *some code to lookup fraction from table;*
  return fraction;
}

myString = [self convertToFractions:(float *)float2];

编辑:

正如其他人所建议的,您应该给 Objective-C 一个全新的外观。我建议你阅读苹果写的this Objective-C Primer

【讨论】:

  • @Moshe 顺便说一句,你和我似乎有共同的朋友。
  • 谢谢摩西。非常感谢。
【解决方案2】:

你在哪里定义你的 outputFraction?您在上面的代码中没有提到它。

猜测您的转换方法被声明为 (void) 意味着它不会返回任何东西。如果您需要它以 NSString 的形式返回结果,请声明如下

-(NSString*) convertToFractions:(float *)float2 aString:(NSMutableString *) myString;

并确保在到达方法结束之前返回一个 NSString

return MyNSStringVariable;

[编辑]

我可以看到您希望 outputFraction 将由您的方法返回,但在 Objective-C 中并非如此(不确定 Pascal)。您只是将 outputFraction 作为方法中的第二个变量传递。

所以“正确”的做法是有一个方法

-(NSString*)convertToFraction:(float*)float2 {
     ...// Do your float to fraction calculation here
     ...// Make sure fraction is formatted as NSString
     return YourFractionVariable;
}

然后您可以将返回值分配给您选择的变量,例如:

NSString *fraction = [self converToFraction:aFloatNumber];
NSLog (@"fraction is %@", fraction);

干杯, 罗格

【讨论】:

  • 他大概是出于某种原因从aString:参数中获取了myString
  • 谢谢罗格。这很有帮助。不过有一件事。我发现我必须在 aFloatVariable 前面添加 & 符号。现在完美运行。
【解决方案3】:

为什么不直接返回字符串?

- (NSString*)convertToFractions:(float)float {
    //Bla bla do everything
    return [myString autorelease]; //Autorelease is for memory-management
}

顺便说一句:你真的需要阅读 ObjC。请不要尝试在 ObjC 上使用您的旧帕斯卡知识。这是不同的,你的知识并不真正适用。

我建议购买一本关于 ObjC 的书或阅读一些很好的教程。 (苹果本身也有一些非常好的)

【讨论】:

【解决方案4】:

如果您不想像其他人建议的那样从您的方法中返回 NSString,您可以将一个指向 NSString 的指针传递给您的函数(就像您将 NSError** 传递给某些标准 api 调用(例如在 NSFileManager 方法中)一样)。您的代码将类似于:

NSString *outputFraction;
[self convertToFractions:&float1 aString:&outputFraction];

-(void) convertToFractions:(float *)float2 aString:(NSMutableString **) myString{
  ...
   if (myString)
      *myString = [NSString stringWithString:[[decimalInchArray objectAtIndex:x]objectAtIndex:1]];
}

【讨论】:

  • 谢谢弗拉德。双指针真的让我很困惑,但你的例子是一个真正的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-13
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多