【问题标题】:“Static member '…' cannot be used on instance of type '…'”“静态成员 '...' 不能用于类型 '...' 的实例”
【发布时间】:2019-02-18 15:07:39
【问题描述】:

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

部分代码如下所示

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

变量被声明为我的一个视图控制器的属性,

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

【问题讨论】:

    标签: ios iphone xcode oop swift4.2


    【解决方案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")
       }
    }
    

    或者反过来把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()
    

    【讨论】:

    • 第一个例子效果很好!看起来更干净,谢谢!
    【解决方案2】:

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

    按照你的例子:

    type(of: theObject).theTask()

    【讨论】:

      猜你喜欢
      • 2016-06-24
      • 1970-01-01
      • 2017-11-25
      • 1970-01-01
      • 1970-01-01
      • 2018-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多