在目标c中访问类方法。使用的是self还是classname?

Weishi Z

我正在学习iOS编程,并且对以下有关关键字self的使用的代码感到困惑。

据我了解,self就像Java一样this它引用当前实例。当我想调用类方法时,通常的方式应该是这样,[PlayingCard validSuits];但是也可以在实例上入侵类方法,对吗?[self validSuits];(我在课堂上,所以自我指的是PlayingCard的一个实例)

但是在下面的代码中,它在某处给出了错误但在其他地方看起来还不错(由3条注释指出,这在Xcode 5.1中)

我有什么想念的吗?

(PS,我认为我遇到了与这里类似的问题,目前还没有人回答。即使使用[PlayingCard validSuits],他也遇到了相同的错误。)

//  PlayingCard.m

#import "PlayingCard.h"

@implementation PlayingCard
@synthesize suit = _suit; 

+ (NSArray *)validSuits {
    return @[@"♠︎", @"♣︎", @"♥︎", @"♦︎"];
}

+ (NSArray *)rankStrings {
    return @[@"?", @"A", @"2", @"3", @"4",@"5",@"6",@"7",@"8",@"9",@"10",@"J",@"Q",@"K"];

}

+ (NSUInteger)maxRank {
    return [[PlayingCard rankStrings] count] -1; 
          //1. [self rankStrings] works fine.** 
}


//override super class's method
- (NSString *)contents {

    NSArray *rankStrings = [PlayingCard rankStrings];  
           //2. if change rankStrings to self, then error:
           //No visible @interface for 'PlayingCard' declares the selector 'rankStrings'

    return [rankStrings[self.rank] stringByAppendingString:self.suit];
}

- (void) setSuit:(NSString *)suit {
    if ( [[PlayingCard validSuits] containsObject:suit]) {  
        //3.error when changed to [self validsuits] 
        //No visible @interface for 'PlayingCard' declares the selector 'validsuits'**
       _suit = suit;
    }

}

- (NSString *) suit {
    return _suit ? _suit : @"?";
}

@end

头文件:

//  PlayingCard.h

#import "Card.h"

@interface PlayingCard : Card

@property (nonatomic, strong) NSString *suit;
@property (nonatomic) NSUInteger rank;

+ (NSArray *) validSuits;
+ (NSUInteger) maxRank;

@end
富有的

如果要从(相同类的)类方法内部调用另一个类方法,则可以使用[self classMethod]但是,如果您在实例方法中,并且需要调用该类的类方法,则可以使用[[self class] classMethod]

正如@Martin R所指出的那样-如果您是子类PlayingCard,则调用self类方法将是该子类,而不是该子类PlayingCard

编辑:

为了完整性,您需要执行以下操作:

//  PlayingCard.m

#import "PlayingCard.h"

@implementation PlayingCard
@synthesize suit = _suit; 

+ (NSArray *)validSuits {
    return @[@"♠︎", @"♣︎", @"♥︎", @"♦︎"];
}

+ (NSArray *)rankStrings {
    return @[@"?", @"A", @"2", @"3", @"4",@"5",@"6",@"7",@"8",@"9",@"10",@"J",@"Q",@"K"];

}

+ (NSUInteger)maxRank {
    return [[self rankStrings] count] -1; 
}

//override super class's method
- (NSString *)contents {

    NSArray *rankStrings = [[self class] rankStrings];  

    return [rankStrings[self.rank] stringByAppendingString:self.suit];
}

- (void) setSuit:(NSString *)suit {
    if ( [[[self class] validSuits] containsObject:suit]) {  
       _suit = suit;
    }
}

- (NSString *) suit {
    return _suit ? _suit : @"?";
}

@end

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在目标C中使用#define并在swift类中访问

从目标c中的类外部访问属性

C ++使用类Classname;

如何在Objective C中的类方法上使用self

从目标C中的方法访问实例变量

类方法中定义的python函数可以访问self吗?

从线程目标访问`self`

目标 C:如何访问 AppDelegate 中另一个类中声明的类?

在Python OOP中,调用类变量时应使用self还是Class Name?

在类定义中的方法名称中明确使用`self`

在类(C#)中访问方法

使用类方法访问类中的类变量

在目标C类中返回元组的Swift方法

控件类是Tkinter中的类还是方法?

目标 c 超类中的受保护变量在 swift 子类中不可访问

我可以在 Typescript 方法装饰器中访问目标类实例吗?

无法访问包含在框架中的 Swift 4.2 类到目标 C 项目中

尝试访问其他类中的方法时,PyCharm中出现“参数” self”未填充”错误

self.variable.function() 在 python 中的含义或通过类自变量访问方法

在父类的self中访问匿名类的名称。

获取类中的 ipywidget 按钮以通过 self 访问类参数?

C ++无法从类中调用公共方法:未定义对'<ClassName> :: <MethodName>'的引用

无法在此 ref ClassName (byRef) 方法上使用类功能 C# 7.2

我如何在Blazor @inject ClassName classObject中使用/注入“普通” c#类中的服务

访问目标 C 中的本地文件路径

在 Rails 的 self 方法中访问孩子

JS中的类方法与className.prototype方法之间的区别

PHPUnit-使用$ this还是self作为静态方法?

目标c的类名中的“&”被替换为“ _”