ios - 无法使用类型为“(String, withIntermediateDirectories : B) 的参数列表调用 'createDirectoryAtPath'

标签 ios swift swift2 xcode7

我正在为 sqlite 数据库使用 SwiftData 框架。当我将 Xcode 表单 6.4 更新为 7.0.1 时,swift data.swift 文件显示此错误 Cannot invoke 'createDirectoryAtPath' with an argument list of type '(String, withIntermediateDirectories: Bool, attributes: NilLiteralConvertible, error: NilLiteralConvertible) '。我提供了以下代码。

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) {
            if !NSFileManager.defaultManager().createDirectoryAtPath(imageDirPath, withIntermediateDirectories: false, attributes: nil, error: nil) {
                print("Error creating SwiftData image folder")
                return nil
            }
        }
        let imageID = NSUUID().UUIDString
        let imagePath = imageDirPath.stringByAppendingPathComponent(imageID)
        let imageAsData = UIImagePNGRepresentation(image)
        if !imageAsData!.writeToFile(imagePath, atomically: true) {
            print("Error saving image")
            return nil
        }
        return imageID

    }

最佳答案

createDirectoryAtPath 语法更改如下:

- (BOOL)createDirectoryAtPath:(NSString *)path withIntermediateDirectories:(BOOL)createIntermediates attributes:(nullable NSDictionary<NSString *, id> *)attributes error:(NSError **)error NS_AVAILABLE(10_5, 2_0);

所以你可以像这样更新你的代码:

NSFileManager.defaultManager().createDirectoryAtPath(imageDirPath, withIntermediateDirectories: false, attributes: [:])

然后您使用 swift 2.0 完成代码:

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

    let docsPath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0] as String
    let imageDirPath = (docsPath as NSString).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
}

或者您可以使用 stringByAppendingPathComponent 的扩展,因为在 2.0 中它不适用于 String

extension String {

    func stringByAppendingPathComponent(path: String) -> String {

        let nsSt = self as NSString

        return nsSt.stringByAppendingPathComponent(path)
    }
}

你可以这样使用它:

let imageDirPath = docsPath.stringByAppendingPathComponent("SwiftDataImages")
let imagePath = imageDirPath.stringByAppendingPathComponent(imageID)

关于ios - 无法使用类型为“(String, withIntermediateDirectories : B) 的参数列表调用 'createDirectoryAtPath',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32986455/

相关文章:

xcode - 无法在 Swift 中获取设备上的位置

ios - __LP64__ 和 __arm64__ 在 Cocoa 中存在哪些定义可以在编译时区分平台?它们在哪里或如何定义?

ios - 不能将枚举类型作为函数的参数类型传递

ios - 在 ViewController 之间同步以进行后台解析获取

ios - swift 的动态类名

ios - 无法使用分段控件显示 UICollectionView

ios - 在 Swift 中为 XCTest 进行模拟

c++ - Box2d SetLinearVelocity 奇怪的问题

ios - Swift - 运算符 == 不能应用于两个 Int 操作数

ios - 将分数添加到 NSUserDefault