【发布时间】:2015-12-16 10:09:14
【问题描述】:
我是 Objective C 的新手,我正在使用斯坦福 CS193P 课程来学习基础知识。在first lecture 中,据我了解,每当我在头文件中声明一个属性时,Objective C 都会自动为该属性生成setter 和getter,其中getter 名称与属性名称相同。教授还提到了@synthesize 关键字,它用于将某些东西设置为instance variable 名称,例如@synthesize card = _card。
所以现在,也可以直接使用_card 对属性进行任何更改。
但是,他多次提到所有这些都发生在幕后,而我们在实现文件中没有看到这些。
如果是这样,那么在下面的代码中:
//
// PlayingCard.h
// CardGame
//
// Created by Manish Giri on 9/19/15.
// Copyright (c) 2015 Manish Giri. All rights reserved.
//
#import "Card.h"
@interface PlayingCard : Card
@property (nonatomic,strong) NSString *suit; //one of club, heart, spade, diamond
@property (nonatomic) NSUInteger rank; //numbers from 0 through 13
@end
//
// PlayingCard.m
// CardGame
//
// Created by Manish Giri on 9/19/15.
// Copyright (c) 2015 Manish Giri. All rights reserved.
//
#import "PlayingCard.h"
@implementation PlayingCard
//@synthesize suit = _suit;
//override the getter method "contents" to return the description- rank&suit of the playing card
-(NSString *) contents {
//return [NSString stringWithFormat:@"%lu %@", (unsigned long)self.rank, self.suit];
//if rank is 0 or not set, return ?
NSArray *rankStrings = @[@"?", @"1", @"2", @"3", @"4", @"5", @"6", @"7", @"8", @"9", @"10", @"11", @"12", @"13"];
return [rankStrings[self.rank] stringByAppendingString:self.suit];
}
-(NSString *) suit {
//return ? if suit is nil or not set
return _suit?_suit:@"?";
}
-(void) setSuit:(NSString *)suit {
//check the suit to be set is valid
if([@[@"♥︎", @"♦︎", @"♠︎", @"♣︎"] containsObject:suit]) {
_suit = suit;
}
}
@end
为什么会出现错误:
Use of undeclared identifier _suit. Did you mean suit?
我得到这个错误后,我添加了@synthesize suit = _suit这行,错误被修复了,但这不是自动完成的吗?如果不是,有什么区别?
毫无疑问,教授在他的代码(幻灯片中)中没有 @synthesize 行,但仍在使用 _suit。
【问题讨论】:
-
问得很好。
标签: objective-c properties instance-variables