一尘不染

实例成员不能用于Class类型吗?

swift

我试图访问name从Person类继承的Indicator类的变量。但是,我认为我没有正确地进行初始化。

我得到以下信息:’错误:实例成员’name’不能用于’Indicator’`类型。

class Person {
    var name: String

    init(myName: String){
        self.name = myName
    }

    deinit {
        Indicator.letKnowPersonDeinitialized()
    }
}


class Indicator: Person {
    convenience init() {
        self.init()
    }

    static func letKnowPersonDeinitialized() {
        print("\(name)")
    }
}

阅读 312

收藏
2020-07-07

共1个答案

一尘不染

您不能直接以静态方法访问非静态内容。

该方法letKnowPersonDeinitialized是静态的,因为已使用static修饰符对其进行了修改:

static func letKnowPersonDeinitialized() {
  ^
  |
here!
}

name属性Person不是静态的,因为它没有被修改static

由于非静态成员属于该类的每个单独实例,而静态成员属于该类本身,因此静态成员无法直接访问非静态成员。存在实例时,它们只能访问非静态成员。

要解决您的问题,请在letKnowPersonDeinitialized方法中添加一个参数:

static func letKnowPersonDeinitialized(person: Person) {
    print(person.name)
}

并在反初始化器中:

deinit {
    Indicator.letKnowPersonDeinitialized(self)
}

非常重要的东西:

我认为您的代码设计得不好。这不是您使用继承的方式。

继承意味着“是一种”。因此,如果Indicator继承自Person,则意味着指标是一种人。

根据常识,指标不是人。因此,此处不适合使用继承。这没有什么意义。

2020-07-07