2011-11-27 99 views
4

我正在尋找一種方法來從NSString轉換爲類實例變量。對於下面的示例代碼,說過濾器是「colorFilter」。我想filternameclassinstancegohere用colorFilter替換。NSString類實例變量

- (void)filterSelected:(NSString *)filter 
{ 
    self.filternameclassinstancegohere = ….; 
} 
+1

這個類是否有一個特定範圍的過濾器,並且您使用字符串來設置它?你有沒有看過一個枚舉? – jrturton

+0

當前過濾器可以是40個NSString名稱中的任何一個。爲什麼我要這樣做,所以我不得不使用switch語句。 – user523234

+0

= =後應該是什麼?即你的理想方法是self.ColorFilter = _what_? – jrturton

回答

5

儘管針對這個問題給出了很好的解決方案,但我發現我需要的是NSClassFromString方法。這裏是最後一個實現:

- (void)filterSelected:(NSString *)filter 
{ 
    //self.filternameclassinstancegohere = ….; 
    self.myViewController = [[NSClassFromString(filter) alloc] initWithNibName:filter bundle:nil]; 

} 
1

如果過濾器值只能是事小,常數,只需使用一個枚舉和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。它更復雜但更靈活。

+0

好主意。不幸的是,正如我剛纔向傑頓所說的那樣。我不想使用switch語句。 – user523234

4

考慮使用一個帶有字符串鍵而不是40個實例變量的NSMutableDictionary實例變量。

+0

這是另一個案例的另一個好建議。但在我的情況下,它不能應用。 – user523234

+0

像'[self setValue:@「SomeValue」forKey:filter]「的鍵/值編碼可能有效。但是這可能會導致安全問題... –

2

您可以使用NSSelectorFromString()任意選擇:

SEL methodName = NSSelectorFromString(filter); 
[self performSelector:methodName]; 

這將調用一個方法colorFilter在你上面的例子。

在打電話前,明智地使用respondsToSelector進行確認。

+0

這是另一種情況的好建議。但就我而言,我無法應用它。 – user523234

+0

如果你可以用你想要做的事來擴展你的問題,我相信我們可以爲你解決問題:) – jrturton