使用Swift中的函数通过实例访问静态成员

时间:2018-02-24 17:29:13

标签: swift

假设我们正在将父类A扩展为

extension A {
    struct S {
        var x = ""
    }
}

我们有另一个继承A类的类,例如。

class B: A {

}

由于struct / enum是静态成员,我们只能使用类名A来调用struct S:

A.S().x

我想知道是否可以通过某个函数以某种方式使用类B的实例调用struct中的变量。 例如,

var c = B()

我需要通过类B的实例访问结构,如:

c.S().x

那么我们可以在A类中编写一些函数来返回struct S的所有内容吗?类似的东西:

extension A {
    struct S {
        var x = ""
    }
    func getS() {
        // return all members of S (not just x, there can be multiple variables)
    }
}

所以最后我应该可以使用以下方式访问S:     c.getS()。X

2 个答案:

答案 0 :(得分:1)

"因为struct / enum是静态方法。"我认为这是混乱开始的地方。结构不是方法。他们的类型。你不打电话"结构。 S()只是S.init()的简写,它返回一个新实例。没有" S"在A或B的实例内部,因为您没有定义该类型的任何属性。

我相信你想到的类型就是这样:

class A {}

extension A {
    struct S {
        var x = ""
    }

    static var s = S()
}

这会将静态属性s添加到A(因此也会添加到B)。鉴于此,您可以A.s.xB.s.x访问它。

如果您有AB的实例并想要访问它,则可以通过type(of:)完成:

var b = B()
type(of: b).s.x

关于访问这些属性的问题与此不同。也许它确实是整个问题,但在这种情况下,其他所有问题似乎都无关紧要。如果你的意思是:

struct S {
    var x = ""
    func getProperties() -> ??? {
        ???
    }
}

然后不,没有办法在Swift中创建它。斯威夫特内省非常有限。即使有可能,也不清楚您对返回值的期望是什么,或者您可以对结果做些什么。

答案 1 :(得分:0)

  

返回S

的所有成员

不,你要求Swift没有的某种无所不知的内省。如果您想要那种元编程功能,请使用其他编程语言。

但是,你的整体问题从根本上说是没有意义的。您认为声明struct S意味着与B相关的特殊事物。它没有。 struct S不是 S实例;它只是一种类型声明,不再是。这是一个你已命名的类型声明;除此之外,没有什么不同于你在任何文件的顶层说struct S,完全在A或B之外。

这个前提:

  

由于struct / enum是静态方法

......只是喋喋不休;他们不是这样的。它们不是静态的,它们不是方法。它们是类型(或者,如使用短语struct S,类型声明的第一个单词)。

相关问题