2015-02-23 5 views
4

я определяю класс:Swift: Override метод объекта

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

Предположим, что я хочу, чтобы изменить поведение метода speak. В java я бы отказался от этого метода:

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

Как я могу переопределить метод в Swift? Я попытался следующие без толку:

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

Ошибка: Cannot assign to 'speak' in 'person'

Я знаю, что я мог бы установить переменную, чтобы изменить поведение или подкласс Person, но я имею в виду другой случай, когда использование что-то вроде это необходимо. Использование этого примера было легче объяснить.

ответ

4

Вы не можете создавать анонимные классы таким образом в Swift, вместо этого вы должны получить новый класс:

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

Ближайший к анонимным конкретизации, которые переопределяют конкретные методы, чтобы сделать speak функцию свойством:

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, которое сохраняет первоначальное поведение по умолчанию.

Редакторы
+0

: включены функции свойств для подражания желаемому. – mxcl

Смежные вопросы