Я хотел объявить фабрику, чтобы помочь мне создавать экземпляры одноэлементных классов для тестирования без дополнительных затрат на очистку состояния уровня класса между запусками теста. Я думал о том, чтобы использовать фабрику для возврата класса, объявленного внутри функции.
Я предполагал, что класс будет создан на лету и будет сохраняться только до тех пор, пока сохраняется возвращаемая ссылка. Например:
protocol TestClassFactory {
static func make() -> TestClass.Type
}
protocol TestClass {
static var testValue: String { get set }
}
class Factory: TestClassFactory {
static func make() -> TestClass.Type {
class Tester: TestClass {
static var testValue = "Unmodified"
}
return Tester.self
}
}
Однако на практике это не сработало, как ожидалось. В частности, статическое значение, установленное для первого make()
возвращаемого значения, сохраняется во втором.
var testClass1 = Factory.make()
print(testClass1.testValue) // "Unmodified"
testClass1.testValue = "Modified"
print(testClass1.testValue) // "Modified"
var testClass2 = Factory.make()
print(testClass2.testValue) // "Modified" ?
Среда выполнения Swift, похоже, сохраняет класс таким же, как и класс, объявленный и на который ссылаются во время компиляции.
Мои вопросы:
- Есть ли у кого-нибудь ссылка, в которой описано, предназначено ли это поведение? Я бы предположил, что это так, но хотел бы знать наверняка.
- Для моего конкретного случая использования, есть ли у меня какие-либо варианты, кроме как использовать какое-либо отражение / зеркало для динамической генерации типа?