2015-06-07 4 views
1

Я новичок в Swift и пытаюсь написать свою первую функцию, которая вызывает закрытие, которое проходит пользователь. У меня возникли проблемы с вызовом моей функции (которую я назвал забавой). Я также не смог найти примеры этого онлайн. Я просто хочу назвать свое закрытие (я не уверен, что ему передать?), А затем принять решение, основанное на логическом результате? Это кажется очень легким, но я не уверен.Вызов Быстрое закрытие с параметрами

Целью метода является удаление дубликатов в массиве на основе спецификаций пользователей. В моем случае я могу перейти к определенному классу и массиву, а затем удалить все классы с одинаковым именем (т. Е. Строка имени, которая соответствует).

extension Array{ 

    func removeDuplicates<T: Comparable>(fun: (elem: T, arr: [T]) -> Bool) -> [T] 
    { 
     var array = [T]() 
     for element in self 
     { 
      if fun(elem: T(), arr: [T]) 
      { 
       println("hello") 
      } 
     } 

     return array 
    } 


} 
+0

Что такое 'self'? –

+0

Извините, это часть расширения Array. Таким образом, вы бы назвали этот метод в любом выбранном вами массиве. Я обновил блок кода. – applejuiceteaching

+2

Я еще не вижу того, чего вы на самом деле пытаетесь достичь. В любом случае вы * не можете * написать метод расширения массива, который применяется только к ограниченным типам элементов (т. Е. Только к массивам 'Comparable'). См. Http://stackoverflow.com/questions/24938948/array-extension-to-remove-object-by-value или http://stackoverflow.com/questions/27350941/is-it-possible-to-make-an -array-расширение-в-быстроногий, что-это-ограничено к одной CLA. –

ответ

3

Это небольшое обобщение Does there exist within Swift's API an easy way to remove duplicate elements from an array? и может быть то, что вы ищете:

extension Array { 

    func withoutDuplicates<U : Hashable>(attribute : T -> U) -> [T] { 
     var result : [T] = [] 

     var seen : Set<U> = Set() 
     for elem in self { 
      let value = attribute(elem) 
      if !seen.contains(value) { 
       result.append(elem) 
       seen.insert(value) 
      } 
     } 

     return result 
    } 
} 

attribute замыкания применяются к каждому элементу массива, а Set используются для отслеживания уже произошедших значений. Следовательно, значение типа U должно быть Hashable (что соответствует ).

Пример:

struct Person : Printable { 
    let firstName : String 
    let lastName : String 

    var description: String { 
     return "\(firstName) \(lastName)" 
    } 
} 

let array = [ 
    Person(firstName: "John", lastName: "Doe"), 
    Person(firstName: "Joe", lastName: "Miller"), 
    Person(firstName: "Jane", lastName: "Doe") 
] 

let result = array.withoutDuplicates({ $0.lastName }) 
println(result) 
// [John Doe, Joe Miller] 

Альтернативная реализация является

func withoutDuplicates<U : Hashable>(attribute : T -> U) -> [T] { 
    var seen : [U : Bool] = [:] 
    return self.filter { seen.updateValue(true, forKey: attribute($0)) == nil } 
} 

, который использует тот факт, что updateValue() метод Dictionary возвращает предыдущее значение ключа, и, в частности, возвращается nil если ключ не был установлен ранее. Это также просто небольшое обобщение ответа @ rintaro на iOS Swift: Filter array to unique items.

+0

блестящий! благодаря – applejuiceteaching

Смежные вопросы