是否可以向 Class 对象添加“键控下标”?

Ale*_*ray 6 metaclass class objective-c subscript nsobject

在...的脉络中

@implementation MyClass
- (id) objectForKeyedSubscript:(id)k { 
       return [self something:k]; 
}
Run Code Online (Sandbox Code Playgroud)

是否也可以“下标”Class对象?我也即将和你一起发现......但我想我会在测试时发布这个问题,我自己......

+ (id) objectForKeyedSubscript:(id)k { 
       return [self.shared something:k]; 
}
Run Code Online (Sandbox Code Playgroud)

唉……这不是……

id x = MyClass[@"document"];
Run Code Online (Sandbox Code Playgroud)

错误:意外的接口名称“MyClass”:预期的表达式

但是为什么,爸爸? Class肯定得短端NSObject球棍,如果你问我

Ale*_*ray 5

Josh Caswell 的评论指出了这个问题:

您正在使用类型名称。尝试使用变量中的类对象。id myClass = [MyClass class]; myClass[@"document"];或者[MyClass class][@"document"]

我发誓我试过了圣经。但证据就在布丁里……

@interface MyClass : NSObject
@property (readonly) id  boring;
@end
@implementation MyClass
- boring   { return @"typical"; }
+ document { return  @"YEEHAW"; }
- objectForKeyedSubscript:key { return [self valueForKey:key]; }
+ objectForKeyedSubscript:key { 
  return [self performSelector:NSSelectorFromString(key)]; 
}
@end
Run Code Online (Sandbox Code Playgroud)

...

id a = MyClass.new;
id x = a[@"boring"];   // "typical" (via "normal" keyed subscription)
id b = MyClass.class;
   x = z[@"document"]; // "YEEHAW" (via CLASS keyed-subscript!)
Run Code Online (Sandbox Code Playgroud)

或所有我的一个班轮怪异,deaky的有...

x = ((id)MyClass.class)[@"document"] // "YEEHAW" 
Run Code Online (Sandbox Code Playgroud)