Swift: Object Override Method

I define a class:

class Person {
    func speak(phrase: String) {
        NSLog("\(phrase)")
    }
}

Suppose I want to change the behavior of a method speak. In java, I would override this method:

Person p = new Person() {
    @Override
    public void speak(String phrase) {
        // Do something different
    }
};

How can I override a method in Swift? I tried the following to no avail:

let person = Person()
person.speak = { (String) -> () in
    // Do something different
}

Error: Cannot assign to 'speak' in 'person'

I know that I can set a variable to change the behavior or subclass of Person, but I am thinking of another use case where something like this is required. Using this example was easier to explain.

+4
source share
1 answer

You cannot create anonymous classes this way in Swift, instead you should get a new class:

class AnotherPerson: Person {
    override func speak(phrase: String) {
        NSLog("\(phrase) overidden!")
    }
}

The closest to anonymous instances that override certain methods is the speakproperty of the function:

class Person {
    var speak: (String)->() = { (phrase: String) in
        println(phrase)
    }
}

let person = Person()
person.speak("Frank")  // => Frank
person.speak = { (phrase: String) in println("Hi, \(phrase)") }
person.speak("Frank")  // => Hi, Frank

, speak, let, :

class Person {
    let speak: (String)->()

    init(speaker: (String)->() = println) {
        speak = speaker
    }
}

Person().speak("Frank")  // => Frank
Person({ println("Hi, \($0)") }).speak("Frank")  // => Hi, Frank

let person = Person()
person.speak = { println($0) }  // error: cannot assign to speak

println, .

+4

All Articles