«Статический член «…» не может использоваться в экземпляре типа «…»»

У меня есть семейство абстрактных классов, которые я хочу реализовать для выполнения задачи в зависимости от созданного экземпляра. Но когда я пытаюсь вызвать метод, используя переменную, объявленную как базовый класс, я получаю «Статический член «…» не может использоваться в экземпляре типа «…»».

некоторые части кода выглядят так

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, кажется, не любит его.


person ulitosCoder    schedule 18.02.2019    source источник


Ответы (2)


Когда вы создаете и используете экземпляры классов, вы должны объявить 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()
person vadian    schedule 18.02.2019
comment
Первый пример работал очень хорошо! И выглядит чище, спасибо! - person ulitosCoder; 18.02.2019

Для этого вы можете использовать type(of:).

По вашему примеру:

type(of: theObject).theTask()

person Leonardo Wistuba de França    schedule 18.02.2019