xcode – Swift Constants文件 – 类还是结构?

我想在我的 Swift项目中创建一个Constants文件 – 填充静态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 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)

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...