Читайте в данных. Разделите текст на строки. Разделите строки на токены. Конвертируйте каждый токен в Int или, если он потерпит неудачу, в Double.
Я предполагаю, что вы знаете, как читать файлы, поэтому вот пример со строкой c CSV:
let text = """
1,2,3.0
4,5.0,6,z
"""
enum CustomError: Error {
case notAnItOrADouble(String)
}
do {
let numberRows = try text
.split(separator: "\n")
.map { line in
try line.split(separator: ",").map { substring -> Any in
let token = String(substring)
guard let value: Any = Int(token) ?? Double(token) else {
throw CustomError.notAnItOrADouble(token)
}
return value
}
}
numberRows.forEach { row in
row.forEach { number in
print("\(number) is \(type(of: number))")
}
}
} catch (let error) {
print(error)
}
Вывод:
1 is Int
2 is Int
3.0 is Double
4 is Int
5.0 is Double
6 is Int
Попробуйте ввести строку вместо целого или двойного, и вы увидите, что вы получите ошибку с первым непарсируемым токеном.