2016-02-09 3 views
4

меня написать расширение массива для различных элементовуниверсальный параметр не может быть выведен быстрым

extension Array { 
    func distinct<T: Equatable>() -> [T]{ 
     var unique = [T]() 
     for i in self{ 
      if let item = i as? T { 
       if !unique.contains(item){ 
        unique.append(item) 
       } 
      } 
     } 
     return unique 
    } 
} 

И попробуйте вызвать эту функцию как ниже

let words = ["pen", "Book", "pencile", "paper", "Pin", "Colour Pencile", "Marker"] 
words.distinct() 

Но это дает ошибке «общий параметр«T 'не удалось сделать вывод "

+0

Посмотрите http://stackoverflow.com/questions/24091046/unable-to -use-contains-in-a-swift-array-extension ... –

ответ

14

Вы можете избавиться от этой ошибки, сообщив компилятору, что вы ожидаете:

let a: [String] = words.distinct() 

Проблема в том, что компилятор не знает, что такое общий Т. Гораздо лучшим решением было бы сказать компилятору, что вы определяете определенную функцию для всех массивов, где их Элемент Equatable:

extension Array where Element : Equatable { 
    func distinct() -> [Element]{ 
     var unique = [Element]() 
     for i in self{ 
      if let item = i as? Element { 
       if !unique.contains(item){ 
        unique.append(item) 
       } 
      } 
     } 
     return unique 
    } 
} 
Смежные вопросы