2015-01-12 8 views
8

ich dieses Stück Code haben zu vermeiden, die großen Werke und tut genau das, was ich will es tun:Nicht sicher, wie hier Duplizieren Code

  if condition1 { 
       array1 += [array1[i-n]] 
      } else { 
       array1 += [Int (arc4random_uniform(7))] 
       if array1[i] >= array1[i-n] { 
        array1[i] += 1 
       } 
      } //same logic, different condition and array 
      if condition2 { 
       array2 += [array2[i-n]] 
      } else { 
       array2 += [Int (arc4random_uniform(7))] 
       if array2[i] >= array2[i-n] { 
        array2[i] += 1 
       } 
      } 

Aber ich mache genau die gleiche Sache zweimal, nur mit einer anderen Bedingung und anderen Array. Wie vermeide ich es, die Logik zu duplizieren? Ich habe versucht, es die Verpackung als ein Array von zwei Tupeln up:

[ (condition1, array1) , (condition2, array2) ] 

und ich habe, dass ein in for-Schleife:

for tuple in [ (condition1, array1) , (condition2, array2) ] { 
    var (condition, array) = tuple 
    if condition { 
     array += [array[i-n]] 
    } else { 
     array += [Int (arc4random_uniform(7))] 
     if array[i] >= array[i-n] { 
      array[i] += 1 
     } 
    } 
} 

und kompiliert, aber es scheint, als ob das Array kopiert wurde, in Die Änderung von "array" hatte keine Auswirkung auf "array1" oder "array2". Ich habe andere Varianten davon mit tuple.0 und Tuple.1-Notation ausprobiert, konnte das aber nicht kompilieren. Also habe ich versucht NSArrays anstelle von nativen Swift-Arrays zu verwenden ... aber ich konnte nicht herausfinden, wie man das richtig macht, und dachte auf jeden Fall, dass es einen einfacheren Weg geben muss.

Gibt es eine prägnante Möglichkeit, meinen ursprünglichen Code zu wiederholen, um die Logik nicht zu duplizieren?

+0

Sorry für die Mischung mit der Migration früher auf. Der Beitrag wurde wieder geöffnet. –

+1

Sollte dies nicht auf Codereview sein, da es funktionsfähig ist und nicht zu ineffizient? – user2366842

Antwort

1
func alteredArray(var array:[Int], condition: Bool) -> [Int] { 
    if condition { 
     array += [array[i-n]] 
    } else { 
     array += [Int (arc4random_uniform(7))] 
     if array[i] >= array[i-n] { 
      array[i] += 1 
     } 
    } 
    return array 
} 

array1 = alteredArray(array1, condition1) 
array2 = alteredArray(array2, condition2) 

Oder, wenn Sie kurz und bündig das Gefühl sind, benennen Sie die Funktion, array einen inout Parameter machen, entfernen Sie die return, und nennen Sie es wie:

alterArray(&array1, condition1) 
alterArray(&array2, condition1) 
4

es Curry!

func func1(var a: [Int]) -> [Int] { 
    a += [a[i-n]] 
    return a 
} 

func func2(var a: [Int]) -> [Int] { 
    a+= [Int (arc4random_uniform(7))] 
    if a[i] >= a[i-n] { 
     a[i] += 1 
    } 
    return a 
} 

func function(condition: Bool) -> [Int] -> [Int] { 
    switch condition { 
    case true: 
     return func1 
    case false: 
     return func2 
    } 
} 

array1 = function(condition1)(array1) 
array2 = function(condition2)(array2) 

(und die gleichen inout Sachen, die erwähnten andyvn22 hier anwenden kann, auch.)

Verwandte Themen