2016-11-30 1 views
0

if let intensity = intensity {} else {}は繰り返しです。この繰り返しコードを置き換える関数をどのように作成すればよいですか?または私は他のどんなツールを使うことができますか?以下の特定の例で反復コードを取り除く関数を作成するにはどうすればよいですか?

これは初めてです。どんな助けもありがたい。

func process(filters: [String], intensity: Int? = nil) { 
    for filter in filters { 
     switch filter { 
      case "blue": 
       if let intensity = intensity { 
        self.blue(value: intensity) 
       } else { 
        self.blue() 
       } 

      case "contrast": 
       if let intensity = intensity { 
        self.contrast(value: intensity) 
       } else { 
        self.contrast() 
       } 

      case "blackAndWhite": 
       if let intensity = intensity { 
        self.blackAndWhite(value: intensity) 
       } else { 
        self.blackAndWhite() 
       } 

      case "halfBrightness": 
       if let intensity = intensity { 
        self.halfBrightness(value: intensity) 
       } else { 
        self.halfBrightness() 
       } 

      case "doubleBrightness": 
       if let intensity = intensity { 
        self.doubleBrightness(value: intensity) 
       } else { 
        self.doubleBrightness() 
       } 

      default: 
       print("The filter you specified doesn't exist.") 
     } 
    } 
} 

答えて

1
あなたは後から追加された新しいフィルタは、このセクションの変更を必要としないという利点があり、単一のコードブロックを例すべてを置き換える、フィルタ名に基づいてメソッドを呼び出すためにリフレクションを使用することができます

コードの

はここであなたのための出発点です:

let selector_name = filter + ":" + (intensity != nil ? "_:" : "") 
let selector: Selector = Selector(selector_name) 
let method = class_getClassMethod(Test.self, selector) 
let implementation = method_getImplementation(method) 
typealias Function = @convention(c) (AnyObject, Selector, Int) -> Void 
let function = unsafeBitCast(implementation, to: Function.self) 
function(self, selector, intensity!) 

このコードは、あなたの「スイッチ」ブロックを置き換えます。あなたの強度== nilの場合は処理しないので、これは完全ではなく、フィルター名と一致するメソッドが見つからないと処理しません。そして "Test.self"はあなたのクラス名が.selfの接尾辞で置き換えられる必要があります。これは単にあなたを始めさせることを目的としています。

通常、リフレクションを使用するとパフォーマンスが低下します。このコードが毎秒何度も呼び出されない限り、それは重要ではありません。

2

可能なオプションの1つは、これらのすべての方法を変更して、オプションの値を受け入れることです。各メソッドの実装では、適切な値のnilのオプション値を処理します。次に、それぞれのcaseステートメントは次のようになります。

case "whatever": 
    self.someFunction(value: intensity) 

多くのクリーナー。

関連する問題