我收到以下警告:
"无法指定类型' [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 };
答案 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
};