2015-05-07 13 views
5

Biorąc pod uwagę następujące klasy, w jaki sposób można wszystkie wartości w dwóch przypadkach być porównywane ze sobą?Porównaj dwie instancje obiektu w Swift

// Client Object 
// 
class PLClient { 
    var name = String() 
    var id = String() 
    var email = String() 
    var mobile = String() 
    var companyId = String() 
    var companyName = String() 

    convenience init (copyFrom: PLClient) { 
     self.init() 
     self.name = copyFrom.name 
     self.email = copyFrom.email 
     self.mobile = copyFrom.mobile 
     self.companyId = copyFrom.companyId 
     self.companyName = copyFrom.companyName 

    } 

} 

var clientOne = PLClient() 

var clientTwo = PLClient(copyFrom: clientOne) 

if clientOne == clientTwo { // Binary operator "==" cannot be applied to two PLClient operands 
    println("No changes made") 
} else { 
    println("Changes made. Updating server.") 
} 

W tym przypadku przypadkiem jest aplikacja, która prezentuje dane z serwera. Po przekształceniu danych w obiekt tworzona jest kopia obiektu. Użytkownik może edytować różne pola itp., Które zmieniają wartości w jednym z obiektów.

Głównym celem, który może być aktualizowany, musi być porównana do kopii tego obiektu. Jeśli obiekty są równe (wartości wszystkich właściwości są takie same), nic się nie dzieje. Jeśli którakolwiek z wartości nie jest równa, aplikacja przesyła zmiany na serwer.

, jak pokazano w przykładzie kodu operator == nie jest akceptowana, ponieważ wartość ta nie jest określona. Użycie === nie przyniesie pożądanego rezultatu, ponieważ zawsze będą to dwie oddzielne instancje.

+1

przeciążeniem '==' dla twojej klasy. – dasdom

+2

Przez zgodne [Equatable] (https://developer.apple.com/library/ios/documentation/General/Reference/SwiftStandardLibraryReference/Equatable.html) – Alladinian

Odpowiedz

23

Wskaż, że klasa jest zgodny z Equatable protokołu, a następnie wdrożyć operatora ==.

coś takiego:

class PLClient: Equatable 
{ 
    var name = String() 
    var id = String() 
    var email = String() 
    var mobile = String() 
    var companyId = String() 
    var companyName = String() 
    //The rest of your class code goes here 

    public static func ==(lhs: PLClient, rhs: PLClient) -> Bool{ 
     return 
      lhs.name == rhs.name && 
      lhs.id == rhs.id && 
      lhs.email == rhs.email && 
      lhs.mobile == rhs.mobile && 
      lhs.companyId == rhs.companyId && 
      lhs.companyName == rhs.companyName 
    } 
} 
5

Praca off odpowiedzi Duncan C za, mam wymyślić alternatywę, która jest nieco bardziej oczywiste, że jest on używany w sposób niestandardowy:

// Client Object 
// 
class PLClient { 
    var name = String() 
    var id = String() 
    var email = String() 
    var mobile = String() 
    var companyId = String() 
    var companyName = String() 

    convenience init (copyFrom: PLClient) { 
     self.init() 
     self.name = copyFrom.name 
     self.email = copyFrom.email 
     self.mobile = copyFrom.mobile 
     self.companyId = copyFrom.companyId 
     self.companyName = copyFrom.companyName 
    } 

    func equals (compareTo:PLClient) -> Bool { 
     return 
      self.name == compareTo.name && 
      self.email == compareTo.email && 
      self.mobile == compareTo.mobile 
    } 

} 

var clientOne = PLClient() 
var clientTwo = PLClient(copyFrom: clientOne) 

if clientOne.equals(clientTwo) { 
    println("No changes made") 
} else { 
    println("Changes made. Updating server.") 
} 
+0

przemawiają napisać sposób komparator z odpowiednimi podpisu " jest równe:" ? – Damo

+0

Możesz wywołać metodę komparatora "fred", jeśli chcesz. Nie znam żadnego systemu o tej nazwie, więc to zależy od ciebie. Myślę, że "isEqualTo" bardzo dobrze pokazuje zamiar metody, więc byłby to dobry wybór. –

+0

w Swift, prawidłowy sposób wdrożyć test równości jest klasa lub struktura ma mieć ono zgodne z Equatable protokołu. Nie widzę żadnego powodu, aby zaimplementować funkcję taką jak "isEqualTo:" szczególnie, ponieważ klasa mogłaby później zostać rozszerzona na protokół Równości, a następnie mieć dwa potencjalnie różne testy równości. Ponadto metoda "isEqualTo:" może zostać nadpisana przez podklasę. To byłaby Zła Rzecz, ponieważ łamie zasadę "Podklasy A jest A". Funkcja równości == nie może być nadpisana przez podklasę. –

Powiązane problemy