Pracuję nad opracowaniem aplikacji w Swift. Chciałem zaprojektować system dla aplikacji, która pozwalałaby na luźne połączenie między obiektami, a jedną strategią (którą z powodzeniem stosowałem w innych językach) było stworzenie czegoś, co nazywam fabryką instancji. Jest to dość proste i tutaj jest podstawowym realizacja wpadłem w Swift:Alternatywna metoda ładowania w Swift
import Foundation
private var typeGenerators = Dictionary<String, InstanceFactory.GeneratorCallback>()
public class InstanceFactory: NSObject {
public typealias GeneratorCallback =() -> AnyObject!
public class func registerGeneratorFor(typeName: String, callback: GeneratorCallback) {
typeGenerators[typeName] = callback
}
public class func instanceOf(typeName: String) -> AnyObject! {
return typeGenerators[typeName]?()
}
}
Chodzi o to, że gdy instancja obiektu musi mieć dostęp do innej instancji obiektu, zamiast tworzenia że instancja wprost co mocniej para dwa obiekty, pierwszy obiekt odroczyłby fabrykę, aby dostarczyć potrzebną instancję, wywołując metodę instanceOf. Fabryka będzie wiedziała, jak zapewnić różne typy instancji, ponieważ te typy będą rejestrować się w fabryce i zapewnić zamknięcie, które może wygenerować instancję.
Sztuką jest to, jak uzyskać klasy, aby zarejestrować się w fabryce. Poprzednio zrobiłem podobną fabrykę w Objective-C, a sposób, w jaki dostałem rejestrację do pracy, polegał na zastąpieniu metody + obciążenia dla każdej klasy, która musiała zarejestrować się w fabryce. To zadziałało znakomicie dla Objective-C, i pomyślałem, że to może działać również dla Swifta, ponieważ ograniczałbym fabrykę tylko do dostarczania obiektów pochodzących z NSObject. Wyglądało na to, że mam to do roboty i poświęciłem dużo wysiłku na zaprojektowanie klas do wykorzystania w fabryce.
Po aktualizacji do Xcode 6.3 odkryłem, że Apple nie zezwala na stosowanie metody klasy obciążenia w Swift. Bez tego nie jestem świadomy mechanizmu umożliwiającego klasom automatyczne rejestrowanie się w fabryce.
Zastanawiam się, czy istnieje jakiś inny sposób na uruchomienie rejestracji.
Jakie alternatywy są dostępne, aby umożliwić rejestrację klas w fabryce lub jakie inne techniki można zastosować w celu uzyskania tego samego rodzaju luźnego połączenia, jakie zapewnia fabryka?
Możesz kontynuować używanie Objective-C dla tej części ...? – matt
Tak, mogę użyć do tego celu C. Z tego, co widzę, wadą byłoby wprowadzenie dodatkowych modułów dla każdej klasy, która musi zarejestrować się w fabryce, co może nie być tak dużym problemem. Oczywiście mogłem po prostu złożyć całą rejestrację w jedną metodę + obciążenia dla jednej klasy. Jednakże, jeśli to zrobię, równie dobrze mogę dokonać rejestracji w module Swift, jak delegat aplikacji. –
Gdybym użył modułów mulitple, mógłbym nawet dokonać rejestracji w Objective-C++.Podejrzewam, że wszystkie moduły rejestracyjne działałyby tak samo, więc dobrze byłoby skonsolidować tę funkcjonalność. Nie przemyślałem tego całkowicie, ale wygląda na to, że ktoś może może stworzyć szablon C++ w Objective-C++, który może zawierać płytę kotła do rejestracji. Z drugiej strony prawdopodobnie nie ma zbyt wiele kodu, więc może nie jest to warte wysiłku. –