Xcode Swift常量文件-类还是结构?

Xcode Swift常量文件-类还是结构?,xcode,swift,Xcode,Swift,我想在我的Swift项目中创建一个常量文件-用静态let字符串填充 我应该创建为结构还是类?为什么呢?您可以将结构用于静态数据,这是最佳选择: struct staticStrings { static let name = "String1" static let age = "age1" } 要全局访问数据,只需调用staticStrings.name 为什么使用结构及其优于类: 如果结构相对较小且可复制,则最好使用结构,因为复制要比使用类对同一实例进行多个引用安全得多

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


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

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

struct staticStrings {

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

}
要全局访问数据,只需调用
staticStrings.name

为什么使用结构及其优于类: 如果结构相对较小且可复制,则最好使用结构,因为复制要比使用类对同一实例进行多个引用安全得多


有关更多详细信息:

使用类,您可以创建一个子类,显然
可以覆盖
方法。如果您纯粹使用的是
static
,则没有任何区别

如果属性是值类型,
static If let someTypeProperty
就可以了。如果它们是引用类型,则需要特别小心


只是一些有属性的东西:


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

我所知道的唯一简单的方法是使用
静态
函数。
如果您希望能够
子类
重写
函数,显然可以使用
函数。(
静态
不允许覆盖,实际上是
类最终
的别名)

这还可以防止太多类型属性保留在内存中无法摆脱
静态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
更有意义,因为我把太多的行为与
类关联起来


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

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)

当类或结构只有静态属性/方法且永远不会初始化时,类型本身是否为引用或值类型并不重要。这只关系到他们的行为如何影响他们财产的行为。
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)