Można również utworzyć podstawowy pustą klasę, która działa jak gołej protokół i przekazać zamknięcie do funkcji init
że nadpisuje cokolwiek chcesz, na przykład:
class EmptyClass {
var someFunc:() ->() = { }
init(overrides: EmptyClass -> EmptyClass) {
overrides(self)
}
}
// Now you initialize 'EmptyClass' with a closure that sets
// whatever variable properties you want to override:
let workingClass = EmptyClass { ec in
ec.someFunc = { println("It worked!") }
return ec
}
workingClass.someFunc() // Outputs: "It worked!"
To nie jest technicznie „anonimowy” ale działa to w ten sam sposób. Otrzymujesz pustą powłokę klasy, a następnie wypełniasz ją lub zastępujesz parametry, które chcesz, gdy zainicjujesz je z zamknięciem.
Zasadniczo to samo, z wyjątkiem tego, że zamiast spełnić oczekiwania protokołu, przesłonił właściwości klasy.
Nie wygląda na to. Anonimowe zajęcia to jedna z moich ulubionych funkcji Java, więc mam nadzieję, że w końcu będziemy mieli je w Swift. – hpique
@ hpique Prawda, są dobre w Javie, ale nie są tak naprawdę potrzebne w językach, które mają zamknięcia i klasy, które można zadeklarować w metodach. Wszystkie wzorce słuchacza/adaptera w Javie mogą być łatwo implementowane przy użyciu zamknięć, bez klas anonimowych. – Sulthan
@Sulthan Oczywiście, możesz dużo zrobić z zamknięciami i wewnętrznymi klasami. Ale dzięki szerokiemu stosowaniu protokołów w Swift sądzę, że anonimowe klasy mogą być bardzo przydatne w niektórych sytuacjach. – hpique