我试图创建一个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。有没有办法从函数中返回不同的值类型?
答案 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? {
// …
}
}