ตั้งแต่ Xcode 8 คุณสามารถกำหนดคุณสมบัติคลาสใน Obj-C สิ่งนี้ได้รับการเพิ่มให้ทำงานร่วมกับคุณสมบัติคงที่ของ Swift
Objective-C รองรับคุณสมบัติคลาสซึ่งทำงานร่วมกับคุณสมบัติชนิด Swift พวกเขาจะประกาศเป็น: @ คุณสมบัติ (ชั้น) NSString * someStringProperty; พวกเขาไม่เคยสังเคราะห์ (23891898)
นี่คือตัวอย่าง
@interface YourClass : NSObject
@property (class, nonatomic, assign) NSInteger currentId;
@end
@implementation YourClass
static NSInteger _currentId = 0;
+ (NSInteger)currentId {
return _currentId;
}
+ (void)setCurrentId:(NSInteger)newValue {
_currentId = newValue;
}
@end
จากนั้นคุณสามารถเข้าถึงได้ดังนี้:
YourClass.currentId = 1;
val = YourClass.currentId;
นี่เป็นคำอธิบายที่น่าสนใจมากที่ฉันใช้เป็นข้อมูลอ้างอิงในการแก้ไขคำตอบเก่านี้
2011 คำตอบ: (อย่าใช้สิ่งนี้มันแย่มาก)
หากคุณไม่ต้องการประกาศตัวแปรทั่วโลกจริงๆมีตัวเลือกอื่นอาจจะไม่มาก :-) แต่ทำงานได้ ... คุณสามารถประกาศวิธี "รับและตั้งค่า" เช่นนี้โดยมีตัวแปรแบบคงที่ภายใน:
+ (NSString*)testHolder:(NSString*)_test {
static NSString *test;
if(_test != nil) {
if(test != nil)
[test release];
test = [_test retain];
}
// if(test == nil)
// test = @"Initialize the var here if you need to";
return test;
}
ดังนั้นหากคุณต้องการรับค่าเพียงโทร:
NSString *testVal = [MyClass testHolder:nil]
จากนั้นเมื่อคุณต้องการตั้งค่า:
[MyClass testHolder:testVal]
ในกรณีที่คุณต้องการตั้งค่า pseudo-static-var นี้เป็นศูนย์คุณสามารถประกาศtestHolder
ดังนี้:
+ (NSString*)testHolderSet:(BOOL)shouldSet newValue:(NSString*)_test {
static NSString *test;
if(shouldSet) {
if(test != nil)
[test release];
test = [_test retain];
}
return test;
}
และสองวิธีที่สะดวก:
+ (NSString*)test {
return [MyClass testHolderSet:NO newValue:nil];
}
+ (void)setTest:(NSString*)_test {
[MyClass testHolderSet:YES newValue:_test];
}
หวังว่ามันจะช่วย! โชคดี.