How to ensure make sure I´m not accessing data until it´s loaded in?

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)

  • How would I save a UIButton's properties and load with a button?
  • Saving Bool Value on to Plist and Update
  • Save a UIImage and reused it on UIImageview
  • iOS: Can't save file to 'Application Support' folder, but can to 'Documents'
  • Don't have the pictures from directory on CollectionView
  • scale image to smaller size in swift3
  • 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")
        }
    }
    }
    

    Solutions Collect From Internet About “How to ensure make sure I´m not accessing data until it´s loaded in?”

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