如果存在则返回文件,否则返回false

时间:2017-02-07 22:16:13

标签: swift swift3 extension-methods

我试图创建一个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
        }
    }
}

现在我的函数只返回一个Bool,但是我想知道是否有一种方法只返回文件,否则返回false。有没有办法从函数中返回不同的值类型?

2 个答案:

答案 0 :(得分:1)

强烈建议您使用与网址相关的API。这会返回一个可选的select distinct n.id, n.notes from notes n join ( select max(seq_num) as seqnum, id from notes group by id) maxresults on n.id = maxresults.ID where n.seq_num = maxresults.seqnum and n.id in (@MyParam)

UIImage

或使用Leo的大幅减少(稍微减少):

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

答案 1 :(得分: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? {
        // …
    }
}
相关问题