“静态成员 '...' 不能用于类型 '...' 的实例”

“Static member '…' cannot be used on instance of type '…'”

我有一系列抽象 classes 我想实现以根据创建的实例执行任务。但是当我尝试使用声明为基础的变量调用方法时 class 我得到“静态成员'...'不能用于类型'...'的实例”

部分代码如下所示

class BaseClass{
  class func theTask(){
      print("do nothing")
  }
}

class SubClassA: BaseClass{
  class func theTask(){
      print("do class A task")
  }
}

class SubClassB: BaseClass{
  class func theTask(){
      print("do class B task")
  }
}

该变量被声明为我的一个 viewController 的 属性,

class SecondViewController: UIViewController {
  var theObject: BaseClass = BaseClass()

  override func viewDidLoad() {
    super.viewDidLoad()

    if(mysettings.selectedPort ==1){
      theObject = SubClassA()
    }else{
      theObject = SubClassB()
    }

    configureUIElements()
  }

  @IBAction func scanButtonPressed(_ sender: Any) {
    let devices = self.theObject.theTask()
  }
}

那一行

let devices = self.theObject.theTask()

是给我错误的那个 静态成员 'theTask' 不能用于类型 'BaseClass'

的实例

我来自 C++,所以这种编码很常见,但 Swift 似乎不喜欢它。

当您创建和使用 类 的实例时,您必须将 theTask 声明为 instance 方法并覆盖它(您必须这样做无论如何)

class BaseClass{
   func theTask(){
      print("do nothing")
   }
}

class SubClassA: BaseClass{
   override func theTask(){
      print("do class A task")
   }
}

class SubClassB: BaseClass{
   override func theTask(){
      print("do class B task")
   }
}

或者反过来将 type 放入变量并调用 type

上的方法
class BaseClass{
    class func theTask(){
        print("do nothing")
    }
}

class SubClassA: BaseClass{
    override class func theTask(){
        print("do class A task")
    }
}

class SubClassB: BaseClass{
    override class func theTask(){
        print("do class B task")
    }
}

...


var theObject: BaseClass.Type = BaseClass.self

...

if mysettings.selectedPort == 1 {
  theObject = SubClassA.self
}else{
  theObject = SubClassB.self
}

...

let devices = theObject.theTask()

您可以使用 type(of:) 来完成。

按照你的例子:

type(of: theObject).theTask()