【问题标题】:SwiftData Error NSFileManagerSwiftData 错误 NSFileManager
【发布时间】:2016-03-31 23:22:13
【问题描述】:

我正在将 SwiftData 从 Swift 1.2 更新到 Swift 2,经过一些更改和更正后,我仍然遇到一个错误,我不明白为什么会发生这种情况。

代码如下:

    public static func saveUIImage(image: UIImage) -> String? {

    let docsPath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0] as String
    let imageDirPath = docsPath.stringByAppendingPathComponent("SwiftDataImages")

    if !NSFileManager.defaultManager().fileExistsAtPath(imageDirPath) {

        do {
            try NSFileManager.defaultManager().createDirectoryAtPath(imageDirPath, withIntermediateDirectories: false, attributes: [:])
        } catch {
            print("Error creating SwiftData image folder")
            return nil
        }

    }

    let imageID = NSUUID().UUIDString
    let imagePath = (imageDirPath as NSString).stringByAppendingPathComponent(imageID)
    let imageAsData = UIImagePNGRepresentation(image)
    if !imageAsData!.writeToFile(imagePath, atomically: true) {
        print("Error saving image")
        return nil
    }
    return imageID

}

在 'do {' 行 Xcode 抛出以下错误:

无法使用类型为“(String, withIntermediateDirectories: Bool, attributes: _, error: _)”的参数列表调用“createDirectoryAtPath”

关于为什么会发生这种情况的任何提示?快把我逼疯了。

诚挚的问候,并提前致谢。

;)

【问题讨论】:

  • 即使我将属性设置为 nil 仍然会发生错误
  • 奇怪.. 我没有收到该错误消息。你的 Xcode 是什么版本的?
  • 最新的。那么这个类有很多我正在修复的编译错误。这可能是一个 Xcode 错误,因为我有很多代码要迁移到 swift 2 并且它奇怪地检测错误?
  • 是的!尝试清理项目并再次重建也首先解决其他问题。这可能会有所帮助。
  • 我会这样做的。谢谢

标签: ios swift2 nsfilemanager


【解决方案1】:

在我的 Xcode 7.2 中没有:

let imageDirPath = docsPath.stringByAppendingPathComponent("SwiftDataImages")

所以我尝试了这段代码,它编译得很好:

public func saveUIImage(image: UIImage) -> String? {

    let docsPath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0] as String
    let imageDirPath = NSURL(string: docsPath)?.URLByAppendingPathComponent("SwiftDataImages")

    if !NSFileManager.defaultManager().fileExistsAtPath(imageDirPath!.absoluteString) {

        do {
            try NSFileManager.defaultManager().createDirectoryAtPath(imageDirPath!.absoluteString, withIntermediateDirectories: false, attributes: [:])
        } catch {
            print("Error creating SwiftData image folder")
            return nil
        }

    }

    let imageID = NSUUID().UUIDString
    let imagePath = (imageDirPath!.absoluteString as NSString).stringByAppendingPathComponent(imageID)
    let imageAsData = UIImagePNGRepresentation(image)
    if !imageAsData!.writeToFile(imagePath, atomically: true) {
        print("Error saving image")
        return nil
    }
    return imageID
}

【讨论】:

  • 我已经添加了一个字符串扩展,因为该方法在 swift 2 中不可用,但仅在 swift 1.2 中可用
  • .absoluteString 将不起作用,因为它会将file:// 方案前缀添加到 API 无法理解的路径中。
  • 嗯……没想到。谢谢你的小费。
【解决方案2】:

苹果强烈推荐使用NSFileManagerNSData的URL相关API

public func saveUIImage(image: UIImage) -> String? {

  let fileManager = NSFileManager.defaultManager()
  let docsURL = try! fileManager.URLForDirectory(.DocumentDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: false)
  let imageDirURL = docsURL.URLByAppendingPathComponent("SwiftDataImages")

  if !fileManager.fileExistsAtPath(imageDirURL.path!) {
    do {
      try fileManager.createDirectoryAtURL(imageDirURL, withIntermediateDirectories: false, attributes:nil)
    } catch let error as NSError{
      print("Error creating SwiftData image folder", error)
      return nil
    }
  }

  let imageID = NSUUID().UUIDString
  let imageURL = imageDirURL.URLByAppendingPathComponent(imageID)
  let imageAsData = UIImagePNGRepresentation(image)
  if !imageAsData!.writeToURL(imageURL, atomically: true) {
    print("Error saving image")
    return nil
  }
  return imageID
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-13
    • 2014-12-10
    • 2014-07-04
    • 2019-12-28
    • 2012-05-31
    • 2011-03-27
    • 2012-02-02
    • 1970-01-01
    相关资源
    最近更新 更多