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