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

标签 xcode swift

我想在我的 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 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 函数能够子类 覆盖 函数。 (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)

关于xcode - Swift 常量文件 - 类还是结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33888654/

相关文章:

通过子模块手动安装时,IOS RxSwift 在设备上崩溃

ios - 如何跳转到另一个 UINavigationController 中的任何 ViewController

ios - 编辑时tableView中没有didSelectRowAtIndexPath()

iphone - 如何在 iPhone 应用程序中创建多个包?

swift - 函数数组不会保留其创建时的值

swift - GameScene 分享按钮

ios - 当 iOS 应用程序在后台挂起时,自动返回到该应用程序。

Swift UITableView reloadData() UI 行为

ios - 如何在 webViewDidFinishLoad 中运行一次命令?

ios - 生产应用程序崩溃报告 <编译器生成>