2017-02-07 11 views
0

Я пытаюсь создать расширение строки, которое ищет файл в каталоге моего приложения, и либо возвращает этот файл, либо возвращает false, если он не существует. Вот что у меня есть:Возвращаемый файл, если существует, в противном случае возвращает false

extension String { 
    func doesFileWithNameExist() -> Bool { 
     let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as String 
     let url = NSURL(fileURLWithPath: path) 
     let filePath = url.appendingPathComponent(self+".png")?.path 
     let fileManager = FileManager.default 
     if fileManager.fileExists(atPath: filePath!) { 
      return true 
     } else { 
      return false 
     } 
    } 
} 

Сейчас моя функция просто возвращает Bool, но мне интересно, если есть способ просто вернуть файл, если он существует, в противном случае возвращает ложь. Есть ли способ вернуть разные значения из функции?

+1

Возвращение 'nil', если он не существует. – rmaddy

+1

Вы хотите, чтобы моя функция возвращала 'UIImage?'? – MarksCode

+0

Да, это правильно. – rmaddy

ответ

1

Настоятельно рекомендуется использовать API, связанный с URL. Это возвращает дополнительный UIImage:

extension String { 
    func doesFileWithNameExist() -> UIImage? { // maybe better pngImageInDocumentsFolder() 
     let fileManager = FileManager.default 
     do { 
      let url = try fileManager.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false) 
      let fullURL = url.appendingPathComponent(self).appendingPathExtension("png") 
      _ = try fullURL.checkResourceIsReachable() 
      let data = try Data(contentsOf: fullURL) 
      return UIImage(data: data) 
     } catch { 
      return nil 
     } 
    } 
} 

или используя большое сокращение Лео (немного еще пониженное):

var image: UIImage? { 
    guard let url = try? FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false).appendingPathComponent(self).appendingPathExtension("‌​png"), 
      let data = try? Data(contentsOf: url) else { return nil } 
    return UIImage(data: data) 
} 
+0

Я получаю предупреждение 'Результат вызова 'checkResourceIsReachable()' не используется' в строке' try fullURL.checkResourceIsReachable() ', это нормально? – MarksCode

+0

Я обновил ответ. – vadian

+0

Это очень запутанное имя функции для того, что она делает и возвращает. – rmaddy

0

Вы можете вернуть необязательное значение здесь, которое в Swift является «вещью или нолем» - очень близко к «этому файлу или ложному». Например, вот быстрый твик для вашей функции расширения, которая возвращает путь, если файл существует там, или ноль в противном случае:

extension String { 
    func doesFileWithNameExist() -> String? { 
     let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as String 
     let url = NSURL(fileURLWithPath: path) 
     let filePath = url.appendingPathComponent(self+".png")?.path 
     let fileManager = FileManager.default 
     if fileManager.fileExists(atPath: filePath!) { 
      return filePath 
     } else { 
      return nil 
     } 
    } 
} 

Быстрый редакционный комментарий, хотя: этот вид поведения не кажется особенно хорошо подходит для расширения строки. Я бы подумал о написании расширения на FileManager вместо этого, передав строку для имени файла. Учитывая жесткое кодирование расширения «png», может быть, что-то со следующей подписью?

extension FileManager { 
    func pathToExistingPNGFile(named name: String) -> String? { 
     // … 
    } 
} 
+0

Имеет смысл для меня, но было бы проще просто вернуть дополнительный UIImage? – MarksCode

+0

Конечно, в зависимости от того, что вы хотите сделать. С уважением исходный вопрос был немного неоднозначным: «возвращает этот файл», плюс фрагмент, может означать «вернуть путь», «вернуть содержимое данных файла», «вернуть NSFileWrapper», «вернуть файл в класс типа (например, UIImage) »и т. д. Похоже, что ответ Вадяна покрыл эти основания. – Tim

 Смежные вопросы

  • Нет связанных вопросов^_^