繁体   English   中英

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

[英]Swift Constants file - class or struct?

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

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

使用类,您可以创建子类并显然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函数。 如果您希望能够对subclass进行subclass classoverride函数,则显然可以使用class函数。 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)

您可能对静态数据使用结构是最好的选择:

struct staticStrings {

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

}

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

为什么我们使用结构体及其优于类:如果结构体相对较小且可复制,则更可取,因为复制比使用类对同一实例进行多次引用更安全。

有关更多详细信息:结构和类

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM