如何确保在加载数据之前我不会访问数据?

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")