首页 > 解决方案 > 在我的情况下通过协议类型访问变量

问题描述

我有一个协议 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 编译器不允许这样做,编译器告诉我“一行上的连续语句必须用 ';' 分隔”,这对我来说没有意义。如何达到我想要达到的效果?

标签: swift

解决方案


你可以挑选:

选项1

仅对Bar符合以下条件的实例进行协议扩展Foo

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

选项 2

尝试在方法的主体self中向下转换:Bar

extension Foo {
    func someJob() {
        if let barSelf = self as? Bar {
            barSelf.name = "..."
        }
    }
}

推荐阅读