2017-02-07 31 views
0

私のアプリケーションのディレクトリにあるファイルを検索し、そのファイルを返すか、存在しない場合はfalseを返すString拡張を作成しようとしています。ここで私が持っているものです。ファイルが存在する場合はそれを返し、そうでない場合は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 
     } 
    } 
} 

今の私の機能は、単にブールを返しますが、それが存在する場合は、単にファイルを返す方法があります場合、私は思ったんだけど、そうでない場合はfalseを返します。関数から異なる値の型を返す方法はありますか?

+1

リターン 'nil'を。 – rmaddy

+1

私の関数が 'UIImage?'を返すようにするのですか? – MarksCode

+0

はい、そうです。 – rmaddy

答えて

1

URL関連APIを使用することを強くお勧めします。これは、オプション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

'' fullURL.checkResourceIsReachable() '行で 'checkResourceIsReachable()'が '使用されていません'という警告が表示されます。 – MarksCode

+0

私は答えを更新しました。 – vadian

+0

これは、それが何をして返すのかについて非常に混乱している関数名です。 – rmaddy

0

ここでの値をと返すことができます。これはSwiftでは「そのファイルまたは偽」に非常に近いものです。たとえば、ここにあなたの拡張子のファイルが存在する場合は、パスを返す関数、またはそれ以外の場合はnilに迅速に微調整です:

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 
     } 
    } 
} 

迅速な編集コメントが、しかし:行動のこの種はいないようです特にString拡張に適しています。代わりに、ファイル名の文字列を渡してFileManagerに拡張機能を書き込むことを検討したいと思います。 "png"エクステンションのハードコーディングを考えてみましょう。

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

私には意味がありますが、オプションのUIImageを返すほうが簡単ではないでしょうか? – MarksCode

+0

確かに、あなたが何をしたいかによって。元の質問は少し曖昧でした。「返すファイル」とスニペットは、「パスを返す」、「ファイルのデータ内容を返す」、「NSFileWrapperを返す」、「ファイルを返す(UIImageのような)型固有のクラス "などのように見えます。@ vadianの答えはその根拠を覆っています。 – Tim

関連する問題