gpt4 book ai didi

Objective-C "messages"- 正确的阅读方式是什么?

转载 作者:太空狗 更新时间:2023-10-30 03:30:23 24 4
gpt4 key购买 nike

基本上,您可以在 objective-c 中声明一个方法并命名每个参数两次

我觉得这很强大,但我不太确定如何使用它......

当约翰问候凯利时:

[ p Greet:"John"toPerson:"Kelly"greetWith:"hey babe"] ;

有些东西读起来不自然。我不确定经验丰富的 Objective-C 程序员是否会这样写“消息”。

有人可以解释每个参数有两个名称的原因,并且可能是一个更有用的例子来说明如何有效地使用它来为程序赋予意义吗?

还有一点让我很困扰,那就是第一个参数的名称 与“消息”的名称基本相同。您如何通过编写有意义且易于理解的方法/“消息名称”来解决这个问题?

#import <Foundation/Foundation.h>@interface Person : NSObject{}-(void)Greet:(char*)from toPerson:(char*)to greetWith:(char*)greeting ;@end@implementation Person-(void)Greet:(char*)from toPerson:(char*)to greetWith:(char*)greeting ;{  printf( "%s says %s to %s\n", from, greeting, to ) ;}@endint main (int argc, const char * argv[]){  NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];  Person * p = [ Person alloc ] ;  [ p Greet:"John" toPerson:"Kelly" greetWith:"hey babe" ] ;  [ p Greet:"Kelly" toPerson:"John" greetWith:"get bent" ] ;  [ p release ] ;  [pool drain];  return 0;}

最佳答案

首先要做的事:作为文体注释,把你的牙套放在一起:

[ Person alloc ]

应该是

[Person alloc]

我还注意到您在分配时忘记初始化 Person,您应该使用:

Person *p = [[Person alloc] init];

了解如何声明方法需要一点时间。检查框架如何命名其方法很有用。对于您的具体示例,我认为您过度设计了。您正在寻找这样的东西:

Person *john = [[Person alloc] initWithName:@"John"];
Person *kelly = [[Person alloc] initWithName:@"Kelly"];

[john greetPerson:kelly withGreeting:@"Hey babe."];
[kelly greetPerson:john withGreeting:@"Get bent."];

请注意,我也没有将 greetPerson 中的 g 大写。这是 Objective-C 的风格约定。

不要忘记一个对象有自己的身份,因此您很少需要在对象(代表一个人)与某人交谈之前指示它是谁。当您写一条消息时,它应该像英语一样读起来。当你陷入多个论点时——诚然,这很少见——开始用逗号思考:

[john sendEmailToPerson:kelly withSubject:subject body:body attachments:nil];

看看它是如何流动的?甚至还有一些不足之处,我也没有掌握它。给它时间。

关于此的一个非常有用的文档是 Apple 的 Coding Guidelines for Cocoa .


此外,让自己摆脱 C 陷阱。以下是我编写整个程序的方式(我介绍了一大堆概念,所以不要指望能理解所有内容):

#import <Foundation/Foundation.h>

@interface Person : NSObject {
NSString *name;
}

@property (copy) NSString *name;

- (id)init;
- (id)initWithName:(NSString *)nm;
- (void)greetPerson:(Person *)who withGreeting:(NSString *)grt;

@end

@implementation Person
@synthesize name;

- (id)init {
if (self = [super init]) {
name = @"James Bond"; // not necessary, but default
} // values don't hurt.
return self;
}
- (id)initWithName:(NSString *)nm {
if (self = [self init]) {
name = [nm copy];
}
return self;
}

- (void)greetPerson:(Person *)who withGreeting:(NSString *)grt {
NSLog(@"%@ says '%@' to %@", self.name, grt, who.name);
}

- (void)dealloc {
[name release];
[super dealloc];
}

@end

int main(int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

Person *john = [[Person alloc] initWithName:@"John"];
Person *kelly = [[Person alloc] initWithName:@"Kelly"];

[john greetPerson:kelly withGreeting:@"StackOverflow is great, isn't it?"];
[kelly greetPerson:john withGreeting:@"Weren't we supposed to flirt?"];

[john release];
[kelly release];

[pool drain];
return 0;
}

此代码完全未经测试,因此如果它能顺利运行,我将印象深刻。

关于Objective-C "messages"- 正确的阅读方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1697807/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com