Отображение значений PickerView из базы данных Core

Я новый разработчик IOS. Я использую Xcode 8 и swift 3.
Я хочу отобразить значения в pickerView из данных, сохраненных в основной базе данных. Мой код ниже имеет ошибку (фатальная ошибка: индекс вне диапазона)

Я определяю массив для хранения извлеченных данных из основной базы данных

  var boundName  = [String]()
  var expenses = [NSManagedObject]()// variable to fetch the data from core database
  var num = 0// variable to hold the count of the fetched data

вот функции для pickerView

public func numberOfComponents(in pickerView: UIPickerView) -> Int {
    return 1;
}

func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {

    let request = NSFetchRequest <NSFetchRequestResult> (entityName : "ExpenseBound_Table")
    request.returnsObjectsAsFaults = false


    do {
        expenses = try self.context.fetch(request) as! [NSManagedObject]
       num = expenses.count

    } catch { print(error) }

    return num;
}

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {


    let request = NSFetchRequest <NSFetchRequestResult> (entityName : "ExpenseBound_Table")
    request.returnsObjectsAsFaults = false

    do{
    expenses = try self.context.fetch(request) as! [NSManagedObject]

        if expenses.count > 0 {


              let person = expenses[row] 
               let boundText = person.value(forKey: "boundName_Expense" ) as? String
              boundName [row] = boundText! //error fires here fatal error: Index out of range




        }

    }
    catch{
        print ("Fetch Faield")
    }
    return boundName[row]
}

1 ответ

  1. Массив объявляется с помощью:

    var boundName = [String]()
    

    Объявление таким образом не определяет размер массива, поэтому при запуске следующей строки произойдет сбой:

    boundName [row] = boundText!
    

    Решение:

    Используйте appendвместо:

    boundName.append(boundText!)