如何确保在加载数据之前我不会访问数据?
How to ensure make sure I´m not accessing data until it´s loaded in?
我是编程新手,我的代码收到错误:致命错误:在展开可选值时意外发现 nil
2017-10-27 16:06:16.755817+0200 Inspireme1.0[836:85307] 致命错误:在展开可选值时意外发现 nil
(lldb)
新错误:
致命错误:索引超出范围
2017-10-27 19:08:05.488502+0200 Inspireme1.0[1262:771572] 致命错误:索引超出范围
(lldb)
我已经在这里查过了,但我不知道如何在我的案例中应用它:如何确保在加载之前我没有访问插座
这是我的代码:
var quotes: RandomItems! = RandomItems([
"Jonas",
"Mary",
"Michael",
"Jeff",
"Sarah",
])
@IBAction func PresentText(_ sender: Any) {
PresentingLabel.text = quotes.next() //<-- Error
}
struct RandomItems: Codable
{
var items : [String]
var seen = 0
init(items:[String], seen: Int)
{
self.items = items
self.seen = seen
}
init(_ items:[String])
{ self.init(items: items, seen: 0) }
mutating func next() -> String
{
let index = Int(arc4random_uniform(UInt32(items.count - seen)))
let item = items.remove(at:index) //<--Error
items.append(item)
seen = (seen + 1) % items.count
return item
}
func toPropertyList() -> [String: Any] {
return [
"items": items,
"seen": seen
]
}
}
var randomItems: RandomItems?
override func viewDidAppear(_ animated: Bool) {
// Code to load the struct again after the view appears.
let defaults = UserDefaults.standard
quotes = defaults.codable(RandomItems.self, forKey: "quotes")
}
override func viewWillDisappear(_ animated: Bool) {
// Code to save struct before the view disappears.
let defaults = UserDefaults.standard
if let quotes = quotes {
defaults.set(codable: quotes, forKey: "quotes")
}
}
}
引号不应该是可选的。
您需要在 viewDidAppear 中处理可选结果,而不是假设引号总是会展开。
quotes = defaults.codable(RandomItems.self, forKey: "quotes") ??
随机项目([])
在 viewDidLoad 中:
defaults.set(codable: quotes, forKey: "quotes")
我是编程新手,我的代码收到错误:致命错误:在展开可选值时意外发现 nil 2017-10-27 16:06:16.755817+0200 Inspireme1.0[836:85307] 致命错误:在展开可选值时意外发现 nil (lldb)
新错误: 致命错误:索引超出范围 2017-10-27 19:08:05.488502+0200 Inspireme1.0[1262:771572] 致命错误:索引超出范围 (lldb)
我已经在这里查过了,但我不知道如何在我的案例中应用它:如何确保在加载之前我没有访问插座
这是我的代码:
var quotes: RandomItems! = RandomItems([
"Jonas",
"Mary",
"Michael",
"Jeff",
"Sarah",
])
@IBAction func PresentText(_ sender: Any) {
PresentingLabel.text = quotes.next() //<-- Error
}
struct RandomItems: Codable
{
var items : [String]
var seen = 0
init(items:[String], seen: Int)
{
self.items = items
self.seen = seen
}
init(_ items:[String])
{ self.init(items: items, seen: 0) }
mutating func next() -> String
{
let index = Int(arc4random_uniform(UInt32(items.count - seen)))
let item = items.remove(at:index) //<--Error
items.append(item)
seen = (seen + 1) % items.count
return item
}
func toPropertyList() -> [String: Any] {
return [
"items": items,
"seen": seen
]
}
}
var randomItems: RandomItems?
override func viewDidAppear(_ animated: Bool) {
// Code to load the struct again after the view appears.
let defaults = UserDefaults.standard
quotes = defaults.codable(RandomItems.self, forKey: "quotes")
}
override func viewWillDisappear(_ animated: Bool) {
// Code to save struct before the view disappears.
let defaults = UserDefaults.standard
if let quotes = quotes {
defaults.set(codable: quotes, forKey: "quotes")
}
}
}
引号不应该是可选的。
您需要在 viewDidAppear 中处理可选结果,而不是假设引号总是会展开。
quotes = defaults.codable(RandomItems.self, forKey: "quotes") ?? 随机项目([])
在 viewDidLoad 中:
defaults.set(codable: quotes, forKey: "quotes")