使用Swift中的函数通过实例访问静态成员
假设我们将父类a扩展为使用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
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() -> ??? {
???
}
}