Как правильно кодировать предложение Котлина (или делегирование классов) в Swift? - PullRequest
1 голос
/ 10 апреля 2019

Мне нужно перекодировать в Swift класс Kotlin, определенный следующим образом:

class A(private val foo: FooInterface = FooBase()) : FooInterface by foo {
  ...
}

Это единственный способ добиться этого - напрямую расширить класс A с помощью протокола FooInterface и перенаправить всезвонки на местный частный Foo экземпляр?

extension A: FooInterface {
  func fooFun1() {
    self.privateFooInstance.fooFun1()
  }
}

Какой самый краткий способ сделать это?

1 Ответ

2 голосов
/ 11 апреля 2019

Как вы уже знаете, Swift не имеет прямой поддержки делегирования классов.

Итак, вам может понадобиться больше кода, чем Kotlin, который имеет прямую поддержку Делегирования. Но вместо расширения каждого класса, который реализует протокол, вы можете добавить реализацию по умолчанию для делегирования.

protocol FooInterface {
    func fooFun1()

    //...
}
protocol FooDelegateable {
    var fooDelegate: FooInterface {get}
}
extension FooInterface where Self: FooDelegateable {
    func fooFun1() {
        self.fooDelegate.fooFun1()
    }

    //...
}

struct SomeFoo: FooInterface {
    func fooFun1() {
        print("FooInterface is delegated to SomeFoo.")
    }
}

class A: FooInterface, FooDelegateable {
    private let foo: FooInterface

    //FooDelegateable
    var fooDelegate: FooInterface {return foo}

    init(_ foo: FooInterface) {
        self.foo = foo
    }

    //...
}

let a = A(SomeFoo())
a.fooFun1() //->FooInterface is delegated to SomeFoo.

Как это?

...