由于对象存储属性不支持Type属性,因此具有struct type属性对我来说似乎是合理的解决方法。问题:我应该使用内部结构吗?
我喜欢内部结构语法,因为它似乎更好地封装了界面,但我不确定它是否会为每个实例浪费宝贵的内存空间?会吗?
例如
class MyClass {
// inside the class
struct MyStatic {
static let MyConstant = "abc"
}
}
或
// in the same file
struct MyStatic {
static let MyConstant = "abc"
}
class MyClass {
}
答案 0 :(得分:0)
如果您想要最接近Type Property的近似值,那么您将要使用内部struct
;它不会存储在班级的每个实例中。如果您在struct
之外定义class
,那么它将变为全局,这不是一回事。
struct
在class
之外定义:
struct MyStatic {
static let MyConstant = "abc"
}
class MyClass1 {
func test() { println(MyStatic.MyConstant) } // Works because MyStatic is Global
}
class MyClass2 {
func test() { println(MyStatic.MyConstant) } // Works because MyStatic is Global
}
在struct
内定义的 class
:
class MyClass1 {
struct MyStatic {
static let MyConstant = "abc"
}
func test() { println(MyStatic.MyConstant) }
}
class MyClass2 {
func test() { println(MyStatic.MyConstant) } // Compile error: MyStatic is not accessible
}
这也允许您根据MyConstant
重新定义class
(这是类型属性的用途):
class MyClass1 {
struct MyStatic {
static let MyConstant = "abc"
}
func test() { println(MyStatic.MyConstant) } // abc
}
class MyClass2 {
struct MyStatic {
static let MyConstant = "def"
}
func test() { println(MyStatic.MyConstant) } // def
}
您甚至可以添加计算的类型属性来模拟存储的类型:
class MyClass1 {
struct MyStatic {
static let MyConstant = "abc"
}
class var MyConstant: String {
get { return MyStatic.MyConstant }
}
func test() { println(MyClass1.MyConstant) }
}