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

时间:2019-02-18 15:07:40

标签: ios iphone xcode oop swift4.2

我有一个抽象类家族,我想实现这些抽象类来根据创建的实例执行任务。但是,当我尝试使用声明为基类的变量调用该方法时,我得到“静态成员'...'不能用于类型'...'的实例”

一些代码看起来像这样

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")
  }
}

该变量被声明为我的其中一个viewControllers的属性,

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似乎并不喜欢。

2 个答案:

答案 0 :(得分:1)

在创建和使用类的实例时,必须将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")
   }
}

反之亦然,将类型放入变量并在该类型上调用方法

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()

答案 1 :(得分:0)

您可以使用type(of:)完成此操作。

按照您的示例:

type(of: theObject).theTask()