2017-01-26 8 views
0

Я написал эту функцию, чтобы получить разницу между двумя массивами строк.Расширение универсального массива для симметричного разности

func difference<T:Hashable>(array1: [T] ,array2:[T]) ->[T]? { 
    let set1 = Set<T>(array1) 
    let set2 = Set<T>(array2) 
    let intersection = set1.symmetricDifference(set2) 
    return Array(intersection) 
} 

Теперь я хочу, чтобы расширить его функции общего для различных типов как Int, Double и т.д ...

extension Array where Element: Hashable { 
    func difference<T:Hashable>(array2: [T]) -> [T] { 
     let set1 = Set(self) 
     let set2 = Set(array2) 
     let intersection = set1.symmetricDifference(set2) 
     return Array(intersection) 
    } 
} 

С помощью этого расширения, я получаю ошибку:

Generic parameter 'S' could not be inferred. 

Я пробовал разные подходы, но напрасно. В чем может быть проблема?

+2

Вы определяете новый общий разделитель 'T' для своего метода, который не обязательно является тем же типом, что и' Element'. Просто используйте параметр и возвращаемый тип '[Element]' - см., Например, [этот вопрос и вопрос] (http://stackoverflow.com/q/41045212/2976878). – Hamish

+1

'func symmetricDifference (to array: [Element]) -> [Element] {' или 'func symmetricDifference (to array: Array) -> Array {' –

+0

Я думаю, что было бы лучше вернуть Set вместо Array: 'расширение массив, где элемент: Hashable { функ симметрической разности (в массив: Array) -> Установить { возвращаемого набор (сам) .symmetricDifference (массив) } }' –

ответ

0

Это точно так, как @Hamish отметил в своем комментарии выше, вы расширяете Array с одним типом и пытается выполнить symmetricDifference с другим типом (T: Hashable), что компилятор не может вывести.

Вы можете это исправить возвращающий [Element] и использовать это тот же самый тип в качестве аргумента в функции, что-то вроде этого:

extension Array where Element: Hashable { 

    func difference(array2: [Element]) -> [Element] { 
     let set1 = Set(self) 
     let set2 = Set(array2) 
     let intersection = set1.symmetricDifference(set2) 
     return Array(intersection) 
    } 
} 

Я надеюсь, что это поможет вам.

+0

Вы также можете просто использовать 'Array' вместо' [Элемент] ' –

+0

@LeoDabus True !!! Swift выводит тип слишком –

+1

'расширение массива, где элемент: Hashable { функа симметрической разности (в массив: Array) -> Массив { возвращение Array (Set (сам) .symmetricDifference (массив)) } }' не нужно делать второй массив набор –