如何存储来自" String:Any Object"的值到一个空的String数组

时间:2018-05-01 19:38:56

标签: swift

我收到以下警告:

  

"无法指定类型' [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 :(得分:0)

如果你想将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
    };