2016-08-30 10 views
5

Próbowałem utworzyć zestaw z zestawu z zestawu , aby elementy były unikalne. Myślałem, że byłoby to eleganckie podejście do korzystania z inicjatora zestawu, aby wykonać tę pracę. Stworzyłem więc tablicę i spróbowałem zainicjować mój nowy zestaw używając tej tablicy. Ale kompilator narzekał. Próbowałem używać wartości Integer i działa jak urok. Ale z moją własną klasą to nie działa. Pomyślałem także, że Equatable Protocol jest właściwą drogą, ale jak widzisz, nie rozwiązuje mojego problemu.Utwórz zestaw macierzy w Swift

Rozważmy następujący Playground:

import UIKit 

internal struct Object: Equatable { 
    var a: Int 
} 

internal func == (lhs:Object,rhs: Object) -> Bool { 
    return lhs.a == rhs.a 
} 

let array = [Object(a:1),Object(a:1),Object(a:1),Object(a:1),Object(a:2)] 

let set = Set(array) // ERROR 

kompilator skarży się

nie może powoływać się inicjator Ustaw < _> z argumentem typu [Object]

który protokół czy muszę zaimplementować, aby wszystko działało?

+5

'Object' musi ono być zgodne' Hashable', nie tylko 'Equatable'. –

+0

Możliwy duplikat [Zmniejsz tablicę do ustawienia w Swift] (http://stackoverflow.com/questions/34161786/reduce-array-to-set-in-swift) – EmilioPelaez

+0

To nie jest duplikat, wyraźnie pytam o rodzaj protokołu, który muszę wdrożyć. Opisany wątek nie mówi nic o Hashable Protocol i składa się z konstrukcji wykorzystujących redukcję, która może doprowadzić dewelopera do niewłaściwego rozwiązania. Ten post jest dokładniejszy i nie powinien być oznaczany jako duplikat, aby pomóc innym użytkownikom przepełnienia stosu szybciej znaleźć rozwiązanie problemu. –

Odpowiedz

8

Jeśli klikniesz "polecenie" na Set w Xcode, przeniesie Cię do definicji typu Set. I proszę:

/// A collection of unique `Element` instances with no defined ordering. 
public struct Set<Element : Hashable> : Hashable, CollectionType ... 

Jak wspomniano przez Roba elementy muszą potwierdzić Hashable (co z kolei wymaga Equatable).

Regulacja kod:

import Foundation 

internal struct Object: Hashable { 
    var a: Int 
    var hashValue: Int { return a.hash } 
} 

internal func == (lhs:Object,rhs: Object) -> Bool { 
    return lhs.a == rhs.a 
} 

let array = [Object(a:1),Object(a:1),Object(a:1),Object(a:1),Object(a:2)] 

let set = Set(array) // SUCCESS