[Swift] Operator überladen

ismon

Lieutenant
Registriert
Dez. 2006
Beiträge
722
Hallo zusammen,

ich versuche gerade etwas Swift zu lernen.
Dazu lesen ich das Buch https://kofler.info/buecher/swift/.

In einem Beispiel geht das darum eine Klasse zu definieren die das Protokoll Hashable umsetzt.
Diese Protokoll setzt das Equatable Protokoll voraus. D.H. in meiner Klassen Person muss auch diese umgesetzt werden.

Equatable vordert eine Überladung des == Operator.

Mein Problem ist nun, dass ich das Beispiel wie im Buch umgesetzt habe aber ich beim Überlagen der Funktion == immer einen Compiler Fehler bekomme.

Hier der Code aus dem Beispiel:

Code:
import Foundation


class Person : CustomStringConvertible, Hashable {
    
    var name:String
    
    var tel = [ String ]()
    var mail = [ String ]()
    
    init (_ name:String) {
    
        self.name=name
    
    }
    
    var description:String {
        
        let telnr = tel.joinWithSeparator (" ")
        let email = mail.joinWithSeparator (" ")
        return "\(name): \(telnr); \(email)"
        
    }
    
    var hashValue:Int {
            
        var hash = name.hashValue
        for t in tel { hash ^= (t.hashValue &* 13) }
        for m in mail { hash ^= (m.hashValue &* 17) }
        return hash

    }
    
    func ==(lhs:Person, rhs:Person) -> Bool {
    
        return lhs.name == rhs.name && lhs.tel == rhs.tel && lhs.mail == rhs.mail
    
    }
    
    
}

var p = Person("Hermann Huber")
p.tel.append("0123 5325345")
p.mail.append("hermann@huber.com")
print (p)

Es kommt der Fehler: Consecutive Declaration in a line must be separated by ";"
Er wird an der Stellen func ==( angezeigt

Hat jemand eine Idee?

gruß
Simon
 
Zuletzt bearbeitet:
Hast du schon probiert folgendes zu schreiben?

Code:
func ==(lhs:Person; rhs:Person) -> Bool {

Habe nur das Komma gegen ein Semikolon getauscht..
Muss aber dazu sagen, ich kenne mich mit Swift nicht aus.

Gruß
 
Danke @AntiUser

Da steht wie es geht und jetzt wo ichs weiss muss ich leider gestehen dass es auch im Buch richtig beschrieben ist:

Dabei ist aber zu beachten, dass der Operator als globale Funktion implementiert werden muss, nicht als Methode innerhalb des Typs!

Ich habe nicht nur nicht richtig gelesen sondern auch den Code falsch abgetippt....:headshot:

Aber das eine globale Funktion ausserhalb der Klasse definiert werden kann/muss kannte ich bis dahin auch nicht.

Hier nochmal wie es aussehen muss:

Code:
import Foundation


class Person : CustomStringConvertible, Hashable {
    
    
    var name:String
    
    var tel = [ String ]()
    var mail = [ String ]()
    
    init (_ name:String) {
    
        self.name=name
    
    }
    
    var description:String {
        
        let telnr = tel.joinWithSeparator (" ")
        let email = mail.joinWithSeparator (" ")
        return "\(name): \(telnr); \(email)"
        
    }
    
    var hashValue:Int {
            
        var hash = name.hashValue
        for t in tel {
            hash ^= (t.hashValue &* 13)
        }
        for m in mail {
            hash ^= (m.hashValue &* 17)
        }
        return hash
    }
    
}

func ==(lhs:Person, rhs:Person) -> Bool {
    
    return lhs.name == rhs.name && lhs.tel == rhs.tel && lhs.mail == rhs.mail
    
}

var p = Person("Hermann Huber")
p.tel.append("0123 5325345")
p.mail.append("hermann@huber.com")
print (p)
 
Aber das eine globale Funktion ausserhalb der Klasse definiert werden kann/muss kannte ich bis dahin auch nicht.

Bei Swift ist halt alles anders :P. Ich persönlich mag Swift eigentlich ganz gern. Leider sind alle meine Projekt bisher in Obj. C geschrieben. Aber die neuen sind alle Swift.

Hier steht übrigens auch noch mal:

The operator function is defined as a global function with a function name that matches the operator to be overloaded (+).

https://developer.apple.com/library...t_Programming_Language/AdvancedOperators.html

Kann jedem nur ans Herz legen, die Dokumentation von Swift direkt bei Apple durch zu lesen. Diese ist wirklich gut!
 
Zurück
Oben