Как сохранить значения из «String: Any Object» в пустой String Array - PullRequest
0 голосов
/ 01 мая 2018

Я получаю следующее предупреждение:

"Невозможно присвоить значение типа '[String: AnyObject]' типу 'String'"

для следующей строки:

TrueData[counter] = newRow

TrueData инициализируется как:

var TrueData = [String]()

и newRow инициализируются как:

var newRow = [String:AnyObject]()

newRow должно быть AnyObject, так как я могу хранить его значения в строковом массиве после каждой итерации цикла for (код сортирует файл CSV)?

Вот весь блок кода, как предлагается в комментариях:

func convertCSV(stringData:String) -> [[String:AnyObject]] {
    //for date formatting
    var  importDateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS"
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = importDateFormat
    var TrueData = [String]()
    //dateFormatter.timeZone = NSTimeZone(abbreviation: "GMT")

    let rows = cleanRows(stringData: stringData)
    if rows.count > 0 {
        //data = []
        //var TrueData = [String: Any]()
        var  columnTitles:[String] = []
        var  columnType:[String] = ["NSDate","Int","Int"]
        var counter = 0


        columnTitles = cleanFields(oldString: rows.first!)
        for row in rows{
            let fields = cleanFields(oldString: row)
            if fields.count != columnTitles.count {continue}
            var newRow = [String:AnyObject]()
            for index in 1..<fields.count{ let column = columnTitles[index]; 
let field = fields[index]; switch columnType[index]
            { case "Int": newRow[column] = Int(field) as AnyObject case 
"NSDate": guard let newField = dateFormatter.date(from: field)
                else { print ("\(field) didn\'t convert");
                    continue };
            newRow[column] = newField as AnyObject default: //default keeps as 
string
                newRow[column] = field as AnyObject } };


            TrueData[counter] = newRow
            counter = counter + 1
        } }

    else { print("No data in file") };
    return TrueData };

1 Ответ

0 голосов
/ 01 мая 2018

Если вы хотите сохранить trueData в виде массива строк, вы можете использовать его, как показано ниже

var TrueData = [[String:AnyObject]]()

var newRow = [String:AnyObject]()

TrueData.append(newRow)

Но если вы хотите использовать TrueData в качестве словаря, то, как показано ниже,

let counter = "key"

var TrueData = [String: String]()

var newRow = [String:AnyObject]()

TrueData[counter] = newRow

[обновлено]

Я заменил в двух местах: одну область объявления и добавление в массив. Просто попробуйте использовать это.

func convertCSV(stringData:String) -> [[String:AnyObject]] {
        //for date formatting
        var  importDateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS"
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = importDateFormat

        /* ------- REPLACED: var TrueData = [String]() ------------- */
        var TrueData = [[String:AnyObject]]() /* */
        /* --------------------- REPLACED --------------------------- */

        //dateFormatter.timeZone = NSTimeZone(abbreviation: "GMT")

        let rows = cleanRows(stringData: stringData)
        if rows.count > 0 {
            //data = []
            //var TrueData = [String: Any]()
            var  columnTitles:[String] = []
            var  columnType:[String] = ["NSDate","Int","Int"]
            var counter = 0


            columnTitles = cleanFields(oldString: rows.first!)
            for row in rows{
                let fields = cleanFields(oldString: row)
                if fields.count != columnTitles.count {continue}
                var newRow = [String:AnyObject]()
                for index in 1..<fields.count{ let column = columnTitles[index];
                    let field = fields[index]; switch columnType[index]
                    { case "Int": newRow[column] = Int(field) as AnyObject case
                    "NSDate": guard let newField = dateFormatter.date(from: field)
                        else { print ("\(field) didn\'t convert");
                            continue };
                    newRow[column] = newField as AnyObject default: //default keeps as string
                        newRow[column] = field as AnyObject } };


                /* ----------- REPLACED: TrueData[counter] = newRow ---------------- */
                TrueData.append(newRow) /* */
                /* --------------------- REPLACED --------------------------- */
                counter = counter + 1
            } }

        else { print("No data in file") };
        return TrueData
    };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...