我在一个类中有数百个实例变量。每次我在班上上课时,我都必须滚动过去。
我非常想将它们放在另一个文件中,例如头文件。
我尝试使用扩展程序:
extension MyClass {
var foo = 0
}
但是我收到错误Extensions must not contain stored properties
。
是否可以在swift主文件之外定义实例变量?我已经广泛使用扩展,但是init方法仍然需要在根类文件中。
答案 0 :(得分:1)
这是不可能的。
对象具有特定的内存布局(由编译器生成),该布局确定每个对象需要多少内存以及对象的每个成员在该内存中的存储位置。
一旦创建了对象,就不能更改其成员的布局。即使这是可行的,并且运行时可以通过某种方式重新分配您拥有的此类的每个对象,并使用新的内存布局,但对于您不拥有的对象(在其他模块中)则无法实现。>
答案 1 :(得分:0)
免责声明:我不容忍在任何类中存储数百个实例OR成员变量。
尽管不能在主类之外定义实例变量,但是可以在主类之外定义静态变量,如下所示:
extension MyClass {
static var foo = 0
}
这是因为静态变量是类的成员变量,这意味着它们属于MyClass
类型而不是实例MyClass()
。
换句话说,以下
let myobj = MyClass()
print(myobj.foo)
导致错误:Static member 'foo' cannot be used on instance of type 'MyClass'
。
但是MyClass.foo
很好,因为foo
是MyClass
类型的静态成员。
我之所以这样发表,是因为它有助于理解为什么您不能在主声明之外定义实例变量并且不滥用静态变量声明。