Рандомный выбор файла для считывания
Я пытаюсь передать рандомное значение( имя файла из enum) в параметр для метода считывания файла. Но выдает ошибку OptinalValue:file .
Как я могу передать рандомное название файла из структуры в параметр метода getDataFromFIle()
ReadFile.swift
import Foundation
var content:String!
class readFile
{
//метод для читки файла
func getDataFromFile(name: String , type:String)
{
let pathFile = Bundle.main.path(forResource: name, ofType: type)
//в этом рядке ошибка
let contentString = try! NSString(contentsOfFile: pathFile!, encoding: String.Encoding.utf8.rawValue)
let randomContent = contentString.components(separatedBy: [".","!"]).randomElement()!//.replacingOccurrences(of: "\"", with: "")
content = randomContent
}
}
TaskFile.swift
import Foundation
struct TaskName
{
enum LvlOne
{
case taskOneLvlOne
case taskTwoLvlOne
case taskThreeLvlOne
var fileNameLvlOne:String
{
switch self {
case .taskOneLvlOne:
return "taskOneLvlOne"
case .taskTwoLvlOne:
return "taskTwoLvlOne"
case.taskThreeLvlOne:
return "TaskThreeLvlOne"
}
}
}
enum LvlTwo
{
case taskOneLvlTwo
case taskTwoLvlTwo
case taskThreeLvltwo
var fileNameLvlTwo:String
{
switch self {
case .taskOneLvlTwo:
return "taskOneLvlTwo"
case .taskTwoLvlTwo:
return "taskTwoLvlTwo"
case.taskThreeLvltwo:
return "taskThreeLvltwo"
}
}
}
}
**ShowContent.swift**
func getContent()
{ let contentFile = readFile.init()
conentFile.getDateFromFile(name: TaskName.LvlTwo.allCases.randomElement()!, type: "txt")
let conentFile = content
lebel.text = contentFile!
}
Ответы (1 шт):
Автор решения: schmidt9
→ Ссылка
В вашем случае можно сделать например так, сделав метод с дженериками
/// Метод для выбора случайного значения, передаем в него первое значение в enum
/// https://stackoverflow.com/a/26261971/3004003
func randomEnumElement<T: RawRepresentable>(_ arg: T) -> T where T.RawValue==UInt32 {
// find the maximum enum value
var count: UInt32 = 0
while let _ = T.init(rawValue: count) {
count += 1
}
// pick and return a new value
let rand = arc4random_uniform(count)
return T.init(rawValue: rand)!
}
Тогда enum для его использования будет таким
struct TaskName
{
enum LvlOne : UInt32
{
case taskOneLvlOne
case taskTwoLvlOne
case taskThreeLvlOne
static var randomElement: Self {
randomEnumElement(LvlOne.taskOneLvlOne)
}
static var fileNameLvlOne: String
{
switch randomElement {
case .taskOneLvlOne:
return "taskOneLvlOne"
case .taskTwoLvlOne:
return "taskTwoLvlOne"
case.taskThreeLvlOne:
return "TaskThreeLvlOne"
}
}
}
// ...
}
Использование
let fileName = TaskName.LvlOne.fileNameLvlOne
getDataFromFile(name: fileName, type: "txt")