假设我们正在将父类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
答案 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.x
或B.s.x
访问它。
如果您有A
或B
的实例并想要访问它,则可以通过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
,类型声明的第一个单词)。