Доступ к переменной через тип протокола в моем случае - PullRequest
0 голосов
/ 15 октября 2018

У меня есть протокол Foo:

protocol Foo {
   func doJob()
}

У меня есть класс, соответствующий протоколу, но у меня есть и собственная переменная name:

class Bar : Foo {
  var name = ""

  // conform to protocol
  func doJob() {
    // implementations
  }
}

В моем расширение из Foo, я хотел бы проверить, является ли self экземпляром Bar, если да, я хочу обновить его значение name.Вот что я попробовал:

extension Foo {
   func someJob() {
      if self is Bar {
          ((Bar) self).name = "John"
       }
   }
}

Но, похоже, компилятор Swift не позволяет этого, компилятор говорит мне: «Последовательные операторы в строке должны быть разделены символом«; », что для меня не имеет смысла,Как добиться того, чего я хочу достичь?

1 Ответ

0 голосов
/ 15 октября 2018

Вы можете выбрать вишню:

опция-1

сделать расширение протокола только для Bar экземпляров, которые соответствуют Foo:

extension Foo where Self == Bar { // or Self: Bar it is up to what you want
    func someJob() {
        self.name = "..."
    }
}

option-2

попытаться уменьшить self как Bar в теле метода:

extension Foo {
    func someJob() {
        if let barSelf = self as? Bar {
            barSelf.name = "..."
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...