如何确保在加载数据之前我不会访问数据? [英] How to ensure make sure I´m not accessing data until it´s loaded in?

查看:25
本文介绍了如何确保在加载数据之前我不会访问数据?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

I´m new at programming and I my code gets the error: fatal error: unexpectedly found nil while unwrapping an Optional value 2017-10-27 16:06:16.755817+0200 Inspireme1.0[836:85307] fatal error: unexpectedly found nil while unwrapping an Optional value (lldb)

New error: fatal error: Index out of range 2017-10-27 19:08:05.488502+0200 Inspireme1.0[1262:771572] fatal error: Index out of range (lldb)

I already looked it up here but I don´t know how to apply this in my case: How to ensure I'm not accessing outlets before they're loaded in

Here is my code:

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

解决方案

Quotes should not be optional.

You need to handle the optional outcome in viewDidAppear rather than assuming quotes will always unwrap.

quotes = defaults.codable(RandomItems.self, forKey: "quotes") ?? RandomItems([])

In viewDidLoad:

defaults.set(codable: quotes, forKey: "quotes")

这篇关于如何确保在加载数据之前我不会访问数据?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆