我创建了一个带有一些变量的类,并且未使用任何默认值进行初始化,因此应在发生Web服务调用时分配所有变量。因此,我已经初始化了类的实例,并将值分配给了变量。
在这里,我想将这些值访问整个项目中的所有类文件。可能吗?我不想使用任何保存方法,例如核心数据和用户默认值,也可以编码本地存储。
请帮帮我吗?我们试图在另一个视图控制器中访问模型类的值。但是我们得到一个零值。预先感谢。
//MARK: Shared Instance
static let sharedInstance = Singleton()
//MARK: Local Variable
var emptyStringArray : [String]? = nil
var completed : Bool!
var id : Int?
var title : String?
var userId : Int?
//MARK: Init Array
private init() {
}
init(Fromarray dictionary : [String:Any]) {
completed = dictionary["completed"] as? Bool
id = dictionary["id"] as? Int
title = dictionary["title"] as? String
userId = dictionary["userId"] as? Int
}
最终致电
class ViewController2: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let BoolValue = Singleton.sharedInstance.completed
print(BoolValue)
}
答案 0 :(得分:1)
这是一个非常糟糕的体系结构决策。
这里的第一个问题是API调用的结果始终是异步的,因此您无法在使用类的属性时就知道类是否已正确初始化。
通过创建依赖于网络调用的强制展开的可选内容,会造成太多歧义。如果API调用失败怎么办?如果互联网连接速度慢怎么办,您现在如何预测自己的单身人士“正常”?在大多数情况下,您将访问nil,这将使您的应用程序崩溃。
我建议您阅读有关Singleton模式(如有必要)以及有关iOS中的体系结构模式的更多信息。
答案 1 :(得分:0)
使用其他功能加载数据并在 WebCall
之后调用func loadData(Fromarray dictionary : [String:Any]) {
completed = dictionary["completed"] as? Bool
id = dictionary["id"] as? Int
title = dictionary["title"] as? String
userId = dictionary["userId"] as? Int
}
网络通话结束后通话
Singleton.sharedInstance.loadData(FromArray : YourDictoinary)
以及整个项目中的
let title = Singleton.sharedInstance.title
答案 2 :(得分:0)
您需要保留单例类的单个对象。
static let sharedInstance = Singleton()
它将创建您单例类的对象。
private init() { } or,
init(fromarray dictionary: [String:Any]) {
completed = dictionary["completed"] as? Bool
id = dictionary["id"] as? Int
title = dictionary["title"] as? String
userId = dictionary["userId"] as? Int
}
它将创建您的singleton类的另一个对象,该对象与上面的形式有所不同。
如果您需要从单例类访问数据。创建您的课程,例如:
class Singleton {
static let sharedInstance = Singleton()
var emptyStringArray: [String]?
var completed: Bool?
var id: Int?
var title: String?
var userId: Int?
func initializeData(_ dictionary: [String:Any]) {
completed = dictionary["completed"] as? Bool
id = dictionary["id"] as? Int
title = dictionary["title"] as? String
userId = dictionary["userId"] as? Int
}
}
并像这样使用它:
override func viewDidLoad() {
super.viewDidLoad()
// Initialize with data
Singleton.sharedInstance.initializeData(["completed": true, "id": 123, "title": "iOS Title", "userId": 572])
// Access data
let boolData = Singleton.sharedInstance.completed
print(boolData)
}