Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Swift中的函数通过实例访问静态成员_Swift - Fatal编程技术网

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

使用Swift中的函数通过实例访问静态成员,swift,Swift,假设我们将父类a扩展为 extension A { struct S { var x = "" } } 我们还有另一个继承类A的类,例如 class B: A { } 由于struct/enum是静态成员,我们只能使用类名A作为调用结构: A.S().x 我想知道,通过某种函数,我们是否可以使用类B的实例调用结构内部的变量。 例如 我需要通过类B的实例访问结构,如: c.S().x 那么我们可以在类A中编写一些函数来返回结构S的所有内容吗?比如: ext

假设我们将父类a扩展为

extension A {
    struct S {
        var x = ""
    }
}
我们还有另一个继承类A的类,例如

class B: A {

}

由于struct/enum是静态成员,我们只能使用类名A作为调用结构:

A.S().x
我想知道,通过某种函数,我们是否可以使用类B的实例调用结构内部的变量。 例如

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

c.S().x
那么我们可以在类A中编写一些函数来返回结构S的所有内容吗?比如:

extension A {
    struct S {
        var x = ""
    }
    func getS() {
        // return all members of S (not just x, there can be multiple variables)
    }
}
因此,最终我应该能够通过以下方式访问S: c、 获取()

将所有成员返回

不,你要求的是某种斯威夫特所没有的全知的内省。如果您想要这种元编程功能,请使用另一种编程语言

然而,你的整个问题表面上毫无意义。你可以看到,认为声明
struct S
意味着与B相关的一些特殊的东西<代码>结构S不是S实例;它只是一个类型声明,不再是了。它是一个您已命名的类型声明;除此之外,它与在任何文件的顶层(完全在A或B之外)说的
struct s
没有什么不同

这个前提是:


As struct/enum是静态方法

…只是胡说八道;它们不是这样的东西。它们不是静态的,也不是方法。它们是类型(或者,在您使用短语
struct S
时,是类型声明的第一个词)。

“as struct/enum是静态方法。”我认为这就是混淆的开始。结构不是方法。他们是类型。你不能“调用”结构
S()
只是
S.init()
的简写,它返回一个新实例。在A或B的实例中没有“S”,因为您尚未定义该类型的任何属性

我相信你心目中的类型实际上是这样的:

class A {}

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

    static var s = S()
}
这会将静态属性
s
添加到
a
(从而也添加到
B
)。鉴于此,您可以通过
A.s.x
B.s.x
访问它

如果您有一个
A
B
的实例并希望访问它,那么可以通过
类型(of:)
来完成:

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

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

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

s
不是静态成员,而是一个内部类,它与具体类型
a
绑定。
var b = B()
type(of: b).s.x
struct S {
    var x = ""
    func getProperties() -> ??? {
        ???
    }
}