В настоящее время я работаю над некоторой обобщенной оболочкой c, которая берет замыкание, «зная», как лениво создавать экземпляр T
любого типа. Цель состоит в том, чтобы внедрить эту оболочку в другие объекты, которые не должны знать о том, как на самом деле создать T
, поскольку это может быть выполнено динамически c во время выполнения, и убедиться, что после создания экземпляра он будет использоваться повторно. из воссозданного.
class LazyInstance<T> {
let makeInstance: () -> T
let instanceIfCached: () -> T?
init(makeInstance: @escaping () -> T) {
var instance = T?.none
self.instanceIfCached = {
instance
}
self.makeInstance = {
if let instance = instance {
return instance
}
let newInstance = makeInstance()
instance = newInstance
return newInstance
}
}
}
class LazyThrowingInstance<T> {
let makeInstance: () throws -> T
let instanceIfCached: () -> T?
init(makeInstance: @escaping () throws -> T) {
var instance = T?.none
self.instanceIfCached = {
instance
}
self.makeInstance = {
if let instance = instance {
return instance
}
let newInstance = try makeInstance()
instance = newInstance
return newInstance
}
}
}
В некоторых случаях необходимо, чтобы мое закрытие throw
s, если экземпляр не может быть гарантированно создан. Мой вопрос: есть ли способ обобщить «по умолчанию» и выбрасывать замыкания дополнительным обобщением c или любым другим элегантным способом, который влияет на введенное замыкание с одной стороны и также отражается свойством makeInstance
на с другой стороны?