Я работаю над разработкой приложения в Swift. Я хотел создать систему для приложения, которая позволила бы свободно связываться между объектами, а одна стратегия (которую я успешно использовал на других языках) заключалась в создании того, что я называю фабрикой экземпляров. Это довольно просто, и вот основная реализация я придумал в Swift:Альтернативный способ загрузки в 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]?()
}
}
Идея заключается в том, что, когда экземпляр объекта необходим доступ к другому экземпляру объекта, а не создавать этот экземпляр прямо, который был бы более тесно пара два объекта, первый объект должен отложить до фабрики, чтобы предоставить необходимый экземпляр, вызвав метод instanceOf. Завод будет знать, как предоставлять различные типы экземпляров, потому что эти типы будут регистрироваться на заводе и обеспечить закрытие, которое могло бы генерировать экземпляр.
Трюк заключается в том, как получить классы для регистрации на заводе. Ранее я делал аналогичную фабрику в Objective-C, и способ, которым я получил регистрацию для работы, заключался в том, чтобы переопределить метод + load для каждого класса, который необходимо зарегистрировать на заводе. Это отлично работало для Objective-C, и я полагал, что он может работать и для Swift, так как я бы ограничил фабрику только тем, чтобы предоставлять объекты, которые получены из NSObject. Оказалось, что я получил это на работу, и я потратил немало усилий на разработку классов, чтобы использовать фабрику.
Однако после обновления до Xcode 6.3 я обнаружил, что Apple запретила использование метода класса нагрузки в Swift. Без этого я не знаю о механизме, позволяющем классам автоматически регистрироваться на заводе.
Мне интересно, есть ли другой способ заставить регистрацию работать.
Какие существуют альтернативы, которые могут позволить занятиям на заводе-изготовителе или какие другие методы могут быть использованы для выполнения той же самой свободной связи, которую завод предоставляет?
Вы можете продолжить использовать Objective-C для этой части ...? – matt
Да, я мог бы использовать Objective-C для этого. Из того, что я вижу, недостатком этого является введение дополнительных модулей для каждого класса, который должен регистрироваться на заводе, что может и не быть проблемой. Разумеется, я мог бы просто разбить всю регистрацию на один + метод загрузки для одного класса. Однако, если бы я сделал это, я мог бы так же легко сделать регистрацию в модуле Swift, как и делегирование приложения. –
Если бы мне пришлось использовать модули mulitple, возможно, я даже мог бы зарегистрироваться в Objective-C++.Я подозреваю, что все модули регистрации будут делать почти то же самое, поэтому было бы неплохо объединить эту функциональность. Я не думал об этом полностью, но похоже, что кто-то может создать шаблон C++ в Objective-C++, который может содержать плиту котла для регистрации. Опять же, вероятно, не слишком много задействованного кода, так что, возможно, это не стоит усилий. –