解决方法
使用类,您可以创建子类并显然覆盖类方法.如果你纯粹使用静态则没有任何区别.
如果属性是值类型,则静态,如果让someTypeProperty可以.如果它们是参考类型,则需要额外注意.
只是一些属性的东西:
struct PresetStringsStruct { static let someString : String = "Some Text" // struct static let someView : UIView = UIView(frame: CGRectZero) private init () { print("init") // never happens } } class PresetStringsClass { static let someString : String = "Some Text" // struct static let someView : UIView = UIView(frame: CGRectZero) private init () { print("init") // never happens } }
struct属性按预期工作.
// value properties var txtStruct = PresetStringsStruct.someString // "Some Text" txtStruct = "SomeOtherText" // "SomeOtherText" var txtStruct2 = PresetStringsStruct.someString // "Some Text" var txtClass = PresetStringsClass.someString // "Some Text" txtClass = "SomeOtherText" // "SomeOtherText" var txtClass2 = PresetStringsClass.someString // "Some Text"
// reference properties var viewStruct = PresetStringsStruct.someView viewStruct.frame = CGRect(x: 0,y: 0,width: 50,height: 50) var viewStruct2 = PresetStringsStruct.someView // CGRect(x: 0,height: 50) var viewClass = PresetStringsClass.someView viewClass.frame = CGRect(x: 0,height: 50) var viewClass2 = PresetStringsClass.someView // CGRect(x: 0,height: 50)
我所知道的唯一一种傻瓜式方法是使用静态函数.如果您希望能够对类进行子类化并覆盖函数,则显然可以使用类函数. (static不允许覆盖,实际上是类final的别名)
这也可以防止太多的类型属性保留在内存中没有办法摆脱静态let someProperty:Int = 0
struct PresetStringsStruct { static func someStringFunc() -> String { return "SomeText" } static func someViewFunc() -> UIView { return UIView(frame: CGRectZero) } } class PresetStringsClass { static func someStringFunc() -> String { return "SomeText" } static func someViewFunc() -> UIView { return UIView(frame: CGRectZero) } }
然后由你决定什么更有意义.由于封闭的结构或类本身从不使用,因此没有区别.对我来说,结构更有意义,因为我将太多的行为与类相关联.
你也可以给自己更多的工作,并摆脱使用函数而不是属性导致的().
struct PresetStringsStruct { static var someString : String { get { return someStringFunc() } } static var someView : UIView { get { return someViewFunc() } } static func someStringFunc() -> String { return "SomeText" } static func someViewFunc() -> UIView { return UIView(frame: CGRectZero) } } var viewStruct = PresetStringsStruct.someView viewStruct.frame = CGRect(x: 0,width: 0,height: 0)