类中存储属性的Swift Type属性

时间:2014-09-12 17:22:25

标签: class swift

由于对象存储属性不支持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 {

}

1 个答案:

答案 0 :(得分:0)

如果您想要最接近Type Property的近似值,那么您将要使用内部struct;它不会存储在班级的每个实例中。如果您在struct之外定义class,那么它将变为全局,这不是一回事。

structclass之外定义:

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) }
}