我正在尋找一種方法來從NSString轉換爲類實例變量。對於下面的示例代碼,說過濾器是「colorFilter」。我想filternameclassinstancegohere用colorFilter替換。NSString類實例變量
- (void)filterSelected:(NSString *)filter
{
self.filternameclassinstancegohere = ….;
}
我正在尋找一種方法來從NSString轉換爲類實例變量。對於下面的示例代碼,說過濾器是「colorFilter」。我想filternameclassinstancegohere用colorFilter替換。NSString類實例變量
- (void)filterSelected:(NSString *)filter
{
self.filternameclassinstancegohere = ….;
}
儘管針對這個問題給出了很好的解決方案,但我發現我需要的是NSClassFromString方法。這裏是最後一個實現:
- (void)filterSelected:(NSString *)filter
{
//self.filternameclassinstancegohere = ….;
self.myViewController = [[NSClassFromString(filter) alloc] initWithNibName:filter bundle:nil];
}
如果過濾器值只能是事小,常數,只需使用一個枚舉和switch語句:
enum Filter
{
ColorFilter,
FooFilter,
BarFilter
};
- (void)filterSelected:(Filter)filter
{
switch(filter)
{
case ColorFilter:
self.colorFilter = ...;
break;
case FooFilter:
self.fooFilter = ...;
break;
case BarFilter:
self.barFilter = ...;
break;
}
}
如果設定篩選值大,可能會經常變化,那麼你也可以使用Key-Value Coding。它更復雜但更靈活。
好主意。不幸的是,正如我剛纔向傑頓所說的那樣。我不想使用switch語句。 – user523234
考慮使用一個帶有字符串鍵而不是40個實例變量的NSMutableDictionary實例變量。
這是另一個案例的另一個好建議。但在我的情況下,它不能應用。 – user523234
像'[self setValue:@「SomeValue」forKey:filter]「的鍵/值編碼可能有效。但是這可能會導致安全問題... –
您可以使用NSSelectorFromString()
任意選擇:
SEL methodName = NSSelectorFromString(filter);
[self performSelector:methodName];
這將調用一個方法colorFilter
在你上面的例子。
在打電話前,明智地使用respondsToSelector
進行確認。
這是另一種情況的好建議。但就我而言,我無法應用它。 – user523234
如果你可以用你想要做的事來擴展你的問題,我相信我們可以爲你解決問題:) – jrturton
這個類是否有一個特定範圍的過濾器,並且您使用字符串來設置它?你有沒有看過一個枚舉? – jrturton
當前過濾器可以是40個NSString名稱中的任何一個。爲什麼我要這樣做,所以我不得不使用switch語句。 – user523234
= =後應該是什麼?即你的理想方法是self.ColorFilter = _what_? – jrturton