簡體   English   中英

Objective-C不創建合成變量

[英]Objective-C Not Creating Synthesized Variables

我是一個初學的iOS開發人員,並且仍然習慣於這個合成變量的概念和XCode自動創建變量和setter / getter方法。 我做了很多研究,但未能找到解決我面臨的問題的答案。

我創建了一個頭類,如下所示:

#import "Card.h"

@interface PlayingCard : Card

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

@end

我有以下實現類:

#import "PlayingCard.h"

@implementation PlayingCard

- (NSString *)contents
{
    NSArray *rankStrings = @[@"?",@"A",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9",@"J",@"Q",@"K"];
    return [rankStrings[self.rank] stringByAppendingString:self.suit];
}

- (void)setSuit:(NSString *)suit
{
    if([@[@"♥︎",@"♦︎",@"♠︎",@"♣︎"] containsObject:suit]) {
        _suit = suit;
    }
}

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

@end

我的錯誤是,每當我使用_suit變量時,我從XCode得到一個錯誤:

Use of undeclared identifier '_suit'; did you mean 'suit'?

我的理解是_suit是由編譯器自動生成的,我應該能夠使用“_suit”訪問頭文件中定義的“suit”屬性。 是因為我重寫了編譯器自動生成的setter和getter方法嗎? 將“_suit”更改為“self.suit”似乎可以解決問題,但我很困惑為什么看起來我的下划線合成變量沒有被生成。 對此有任何見解將不勝感激,謝謝!

如果為@property手動創建兩個訪問器(setter和getter),編譯器會假定您不需要/希望它為您合成它們 - 以及相應的實例變量。 有兩種可能的解決方案。 要么自己聲明實例變量:

@implemntation PlayingCard
{
    NSString *_suit;
}

或者,我的首選方法是在自定義訪問器上方使用顯式的@synthesize語句告訴編譯器您仍然想要為該屬性合成實例變量:

@synthesize suit = _suit;

注意= _suit是必要的,因為由於遺留的原因,一個簡單的@synthesize suit; 將默認命名為沒有下划線前綴的ivar suit

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM