Я работаю из предыдущей публикации в AppCode под названием «Основные данные: предварительная загрузка данных и использование существующей базы данных SQLite», расположенной здесь: https://www.appcoda.com/core-data-preload-sqlite-database/
В публикации Саймона Нг есть функция parseCSV, которая выполняетвесь тяжелый процесс сканирования через .csv и разбиения его на соответствующие строки, чтобы затем элементы каждой строки могли быть сохранены в соответствующем managedObjectContext в основных данных.
К сожалению, весь код выглядит написаннымв Swift 1.0 или Swift 2.0, и я не смог понять ошибки, которые я получаю при преобразовании его в Swift 4.
Я внес все изменения, предложенные Xcode в отношении «этого»был заменен на «тот», с последней ошибкой, сообщавшей мне, что «метки аргументов» (contentsOfURL :, encoding :, error :) «не соответствуют ни одной из доступных перегрузок», которые я не смог ни понять, ни исправить.
// https://www.appcoda.com/core-data-preload-sqlite-database/
func parseCSV (contentsOfURL: NSURL, encoding: String.Encoding, error: NSErrorPointer) -> [(name:String, detail:String, price: String)]? {
// Load the CSV file and parse it
let delimiter = ","
var items:[(name:String, detail:String, price: String)]?
if let content = String(contentsOfURL: contentsOfURL, encoding: encoding, error: error) {
items = []
let lines:[String] = content.componentsSeparatedByCharactersInSet(NSCharacterSet.newlineCharacterSet()) as [String]
for line in lines {
var values:[String] = []
if line != "" {
// For a line with double quotes
// we use NSScanner to perform the parsing
if line.range(of: "\"") != nil {
var textToScan:String = line
var value:NSString?
var textScanner:Scanner = Scanner(string: textToScan)
while textScanner.string != "" {
if (textScanner.string as NSString).substring(to: 1) == "\"" {
textScanner.scanLocation += 1
textScanner.scanUpTo("\"", into: &value)
textScanner.scanLocation += 1
} else {
textScanner.scanUpTo(delimiter, into: &value)
}
// Store the value into the values array
values.append(value! as String)
// Retrieve the unscanned remainder of the string
if textScanner.scanLocation < textScanner.string.count {
textToScan = (textScanner.string as NSString).substring(from: textScanner.scanLocation + 1)
} else {
textToScan = ""
}
textScanner = Scanner(string: textToScan)
}
// For a line without double quotes, we can simply separate the string
// by using the delimiter (e.g. comma)
} else {
values = line.components(separatedBy: delimiter)
}
// Put the values into the tuple and add it to the items array
let item = (name: values[0], detail: values[1], price: values[2])
items?.append(item)
}
}
}
return items
}
5-я строка:
если let content = String (contentsOfURL: contentsOfURL, кодировка: кодировка, ошибка: ошибка) {
выдает следующую ошибку:
Метки аргумента '(contentsOfURL :, encoding :, error :)' не соответствуют ни одному доступномуперегрузки
Что выше моего понимания и уровня навыков.Я просто пытаюсь найти лучший способ импортирования файла CSV через запятую в основной объект данных.
Любая помощь будет принята с благодарностью.Оригинальный пример Саймона Нга кажется идеальным для того, чего я пытаюсь достичь.Просто он очень долго не обновлялся.