(Objective-C)如何调用返回String的自定义方法

时间:2015-08-10 20:58:32

标签: objective-c macos methods implementation

首先,我会告诉你,我是Objective-C的极端初学者。所以我在这里问一个关于我目前关注的 CodeSchool.com 的在线教程的问题。我在教程中做得很好,但我也在使用Xcode Command Line Tool,在教程中编写我自己的主题版本。

我遇到问题的是调用返回字符串的自定义方法,例如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 *消息,但它不起作用。 如何在控制台中显示字符串消息

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

3 个答案:

答案 0 :(得分:1)

为了访问“message”变量中的值并将其输出到控制台,我们需要做一些事情。

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

我们可以通过您创建的辅助方法访问“message”中的值(speakTwo)。为了调用该方法,我们需要一个包含该方法的类的实例:Higgie。在你的main.m中,你创建了一个Higgie - talkingiPhone的实例 - 我们可以用它来实现  我们将在main.m中创建一个指向NSString结果的新指针,以保存我们从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。

答案 1 :(得分:0)

您可以执行此操作以符合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

答案 2 :(得分:0)

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

speakTwo方法中,您正在创建message变量。在该方法中知道它被称为message,除此之外它没有名称。

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

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

speakTwo

或者您可以立即打印出来,如下:

NSString *iPhoneMessage = [talkingiPhone speakTwo];