Как обобщить (бросить) функцию подписи в Swift? - PullRequest
1 голос
/ 24 февраля 2020

В настоящее время я работаю над некоторой обобщенной оболочкой 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 на с другой стороны?

...