gpt4 book ai didi

ios - 我真的需要单例上的共享实例吗?

转载 作者:可可西里 更新时间:2023-11-01 02:18:09 25 4
gpt4 key购买 nike

我已经编写了一个辅助结构,用于将内容保存和加载到 NSUserDefaults

import UIKit

struct Database {

static let defaults = NSUserDefaults.standardUserDefaults()

static var myVariable: AnyObject?

static func save() {
defaults.setObject(myVariable, forKey: "myVariable")
}

static func load() {
if let myVariable = defaults.objectForKey("myVariable") {
self.myVariable = myVariable
}
}

static func clear() {
defaults.removeObjectForKey("myVariable")
}
}

现在我可以简单地使用 Database.load()NSUSerDefaults 加载 myVariable。但是,使用这段代码也可以实现同样的效果:

struct Database2 {

static var sharedInstance = Database()

let defaults = NSUserDefaults.standardUserDefaults()

var myVariable: AnyObject?

func save() {
defaults.setObject(myVariable, forKey: "myVariable")
}

func load() {
if let myVariable = defaults.objectForKey("myVariable") {
self.myVariable = myVariable
}
}

func clear() {
defaults.removeObjectForKey("myVariable")
}
}

现在我将使用 Database2.sharedInstance.load()

哪一个被视为更好的做法,为什么?如果我可以用 static 声明做我想做的一切,那么 sharedInstance 有什么用?

最佳答案

推荐使用共享实例,至少出于以下原因:

  1. 类方法使单元测试更难
  2. 你需要依赖注入(inject)的类实例
  3. 如果您稍后决定非单例更合适 - 例如你决定为“myVariable”设置两个持久性存储,然后你就卡住了
  4. 而且并非最后,类成员生活在全局空间中,我们应该避免使用全局变量

你应该问的真正问题是,你是否真的需要一个单例(有或没有共享实例)来解决你的问题。如果使用单例的唯一原因是易于访问,那么您实际上并不需要单例。

P.S. 有个很好的article on objc.io关于单例,虽然它是为 Objective-C 编写的,但其中的许多概念也适用于 Swift。

关于ios - 我真的需要单例上的共享实例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34594098/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com