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

时间:2017-10-27 15:01:42

标签: swift save fatal-error

我是编程的新手,我的代码得到错误:致命错误:在展开Optional值时意外发现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")
    }
}
}

1 个答案:

答案 0 :(得分:1)

报价不应是可选的。

您需要在viewDidAppear中处理可选结果,而不是假设引号始终打开。

quotes = defaults.codable(RandomItems.self,forKey:&#34; quotes&#34;)??  RandomItems([])

在viewDidLoad中:

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