Swift Constants文件 - 类还是结构?

时间:2015-11-24 08:25:53

标签: xcode swift

我想在我的Swift项目中创建一个Constants文件 - 填充静态let字符串。

我应该创建结构还是类?为什么?

2 个答案:

答案 0 :(得分:5)

使用类,您可以创建子类,显然是override class方法。如果你纯粹使用static,则没有任何区别。

如果属性是值类型,static if let 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 type时,静态属性将返回对一个实例的引用。

// reference properties
var viewStruct = PresetStringsStruct.someView
viewStruct.frame = CGRect(x: 0, y: 0, width: 50, height: 50)
var viewStruct2 = PresetStringsStruct.someView // CGRect(x: 0, y: 0, width: 50, height: 50)

var viewClass = PresetStringsClass.someView
viewClass.frame = CGRect(x: 0, y: 0, width: 50, height: 50)
var viewClass2 = PresetStringsClass.someView // CGRect(x: 0, y: 0, width: 50, height: 50)

我所知道的唯一傻瓜式方法是使用static个功能。如果您希望class能够显然使用subclass个功能} classoverride这些函数。 (static不允许覆盖,实际上是class final)的别名

这也可以防止太多类型属性留在内存中无法摆脱static 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)
    }
}

然后由您决定什么更有意义。由于封闭的structclass从未使用过,因此没有任何区别。对我来说,struct更有意义,因为我将过多的行为与classes相关联。

您还可以为自己做更多的工作,并摆脱因使用函数而不是属性而导致的()

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, y: 0, width: 50, height: 50)
var viewStruct2 = PresetStringsStruct.someView // CGRect(x: 0, y: 0, width: 0, height: 0)

答案 1 :(得分:1)

您可以将结构用于静态数据是最佳选择:

struct staticStrings {

    static let name = "String1"
    static let age = "age1"

}

要全局访问数据,只需致电staticStrings.name

为什么我们使用结构体而不是类? 如果结构相对较小且可复制,则结构是首选,因为复制比对类的实例具有多个引用更安全。

有关详情:structs and classes