【问题标题】:(Objective-C) How to Call a Custom Method that Returns a String(Objective-C) 如何调用返回字符串的自定义方法
【发布时间】:2015-08-10 20:58:32
【问题描述】:

首先,我要告诉你,我是 Objective-C 的初学者。以至于我在这里问一个关于我目前正在关注的 CodeSchool.com 上的在线教程的问题。我在教程中做得很好,但我也在关注 Xcode 命令行工具,在教程中编写我自己的主题版本。

我遇到的问题是调用返回字符串的自定义方法,例如 NSString *。我的头文件 Higgie.h 如下:

#import <Foundation/Foundation.h>
@interface Higgie : NSObject
@property NSString *phoneName;
@property NSString *modelNumber;
-(void)speak;
-(NSString *)speakTwo;
@end

我的实现文件,名为 Higgie.m,如下:

#import "Higgie.h"

@implementation Higgie

-(void)speak;
{
NSLog(@"%@ says Hello There!", self.phoneName);
}
-(NSString *) speakTwo; { 
NSString *message = [NSString stringWithFormat:@"%@ says hello!", self.modelNumber];
return message;
}
@end

我的 main.m 示例如下:

Higgie *talkingiPhone = [[Higgie alloc]init];
    talkingiPhone.phoneName = @"iPhone 7";
    talkingiPhone.modelNumber = @"iOS 9";
    NSLog(@"I am an %@.", talkingiPhone.phoneName);
    Higgie *talkingAndroid = [[Higgie alloc]init];
    talkingAndroid.phoneName = @"Samsung S7";
    talkingAndroid.modelNumber = @"Android MacadamiaNutCookie";
    NSLog(@"Phone Name: %@", talkingAndroid.phoneName);
    NSLog(@"Model Number/OS: %@", talkingAndroid.modelNumber);
    [talkingiPhone speak];
    [talkingAndroid speak];
    NSLog(@"%@", [talkingiPhone message]);

在 Higgie.m 中,我创建了一个名为“SpeakTwo”的方法,它应该返回一个名为 message 的 NSString * 变量。我也试过在最后一行调用 NSString *message,但它不起作用。 如何在控制台中显示字符串message

更新: 基本上,我想做这样的事情: [talkingiPhone speakTwo]; NSLog(@"%@", 消息); 这不起作用,虽然我不知道为什么。我很确定 speakTwo 返回字符串消息,然后我应该能够使用 NSLog 将其记录到控制台。

【问题讨论】:

  • NSLog(@"%@", [talkingiPhone speakTwo]);
  • 在您的 Higgie.m 文件中,您有一个错字:speakTwo 签名应该是 - (NSString *)speakTwo { 在 speakTwo 之后,大括号之前不应该有分号。

标签: objective-c macos methods implementation


【解决方案1】:

为了访问“消息”变量中的值并将其输出到控制台,我们需要做几件事。

首先,我们需要获取该值并将其存储在某个地方以备后用。

我们可以通过您创建的辅助方法 (speakTwo) 访问“消息”内部的值。为了调用该方法,我们需要一个包含该方法的类的实例:Higgie。在您的 main.m 中,您创建了一个 Higgie 实例 -talkingiPhone - 我们可以使用它。
我们将在 main.m 中创建一个指向 NSString 的新指针 result 来保存我们从 Higgie 的 speakTwo 方法中检索到的值:

NSString *result = [talkingiPhone speakTwo];

接下来,我们需要将它实际输出到控制台(就像你一直在做的那样):

NSLog(@"This is the result of speakTwo: %@", result);

编辑:值返回到哪里,这有什么用处?

每次运行该方法时都会返回该值。您是否“捕获”该值取决于您的代码。在我给出的示例中,我们将返回的值存储在一个指向 NSString 的新指针中,result。如果您只是调用 [talkingiPhone speakTwo]; 而不将其分配给变量,则返回值将永远不会被访问。更一般地说,该值返回到调用方法的位置,而不是返回到它的实现位置(所以在 main.m 中,而不是在 Higgie.m 中)。

这很有用,因为它允许我们有一个方法来做一些通用的和适合类的事情。你有 Higgies,并且经常想让他们输出他们的 modelNumber。使用这样的方法意味着 Higgie 的每个实例都可以使用 speakTwo 并且它将包含 他们的 型号,而不是所有 Higgie 实例的单个 modelNumber。

【讨论】:

  • 在此之前我实际上已经尝试过 [talkingiPhone speakTwo],但我不确定它为什么会起作用。在方法 speakTwo 中,它应该返回消息。有没有一种方法可以让我只记录 message, 而无需调用 speakTwo?
  • 是的!这是你的意思吗?:NSLog(@"%@",talkingiPhone.modelNumber);
  • 我不是这个意思;我想调用方法 speakTwo,它返回消息,以便我可以 NSLog 消息。基本上,我想做这样的事情:[talkingiPhone speakTwo]; (这将返回消息)然后 NSLog(@"%@", message);这可能吗?
  • 是的,请查看我原始答案中的前两个代码。您可以使用talkingiPhone 调用speakTwo 并将该值存储在不同的变量中。但是您必须创建一个变量(我使用“结果”)来存储它。然后您可以在该存储值上调用 NSLog。
  • 这就是您想要的吗?还是我还不明白你需要什么?
【解决方案2】:

您可以这样做以符合您在main.m 中的代码,它声明了一个附加属性message
speak 方法将文本写入message,main.m 中的最后一行记录了消息。

#import <Foundation/Foundation.h>
@interface Higgie : NSObject
@property NSString *phoneName;
@property NSString *modelNumber;
@property NSString *message;
-(void)speak;
@end

#import "Higgie.h"

@implementation Higgie

-(void)speak
{
   self.message = [NSString stringWithFormat:"%@ says Hello There!", self.phoneName];
}
@end

【讨论】:

  • 这不是最好的主意,因为message 属性的值是nil,直到调用–speak;相当笨拙的模式不为message 定义标准访问器,但如果它是... speak 也可能是具有适当getter 的属性,所以我不明白您的答案的重点实际上是因为它只会增加混乱因素。
  • 我只是试图“解释”main.m 中的代码。 message 仅在调用 speak() 时设置。
  • 是的,确实对于这个序列,这个例子效果很好,我无法反驳。
【解决方案3】:

这是你犯的一个相当有趣的错误。

在您的 speakTwo 方法中,您正在创建一个 message 变量。在那个方法里面知道它叫做message,在外面它没有名字。

要检索该对象,请调用函数 speakTwo(如 TomSwift 建议的那样)而不是 message,因为名称 message 根本不存在于该函数之外,而 speakTwo 是对象。

收到字符串后,您可以决定如何处理它,您可以将其存储在一个变量中(这就像给它分配一个名称),如下所示:

NSString *iPhoneMessage = [talkingiPhone speakTwo];

或者你可以马上打印出来,像这样:

NSLog(@"%@", [talkingiPhone speakTwo]);

【讨论】:

    猜你喜欢
    • 2011-03-12
    • 2011-05-22
    • 2012-06-22
    • 2016-02-14
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    • 2014-12-06
    • 1970-01-01
    相关资源
    最近更新 更多