stringByAppendingPathComponent不可用

May*_*sam 127 ios swift swift2

我的应用程序在Instagram上分享照片,为此,首先将其保存在临时目录中:

let writePath = NSTemporaryDirectory().stringByAppendingPathComponent("instagram.igo")
Run Code Online (Sandbox Code Playgroud)

它正在努力Swift 1.2,但不起作用Swift 2.0.

给出错误消息是:

stringByAppendingPathComponent不可用:改为使用NSURL上的URLByAppendingPathComponent.

Dán*_*agy 139

看起来stringByAppendingPathComponent在Swift 2.0中删除了该方法,因此错误消息建议使用:

let writePath = NSURL(fileURLWithPath: NSTemporaryDirectory()).URLByAppendingPathComponent("instagram.igo")
Run Code Online (Sandbox Code Playgroud)

更新:

URLByAppendingPathComponent()已取而代之的appendingPathComponent()是:

let writePath = NSURL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("instagram.igo")
Run Code Online (Sandbox Code Playgroud)

  • @JeffreyNeo实际上,它是正确的,因为在Swift 1.2的String中有一个名为stringByAppendingPathComponent的方法,但是Swift 2.0的String没有.NSString不是Swift语言的一部分,它是Foundation框架的一部分. (3认同)
  • @JeffreyNeo是的,但这不是一个`NSURL`方法,而是一个`NSString` (2认同)

Dha*_*esh 73

它正在工作,NSString你可以像这样使用它:

extension String {
    func stringByAppendingPathComponent(path: String) -> String {
        let nsSt = self as NSString
        return nsSt.stringByAppendingPathComponent(path)
    }
}
Run Code Online (Sandbox Code Playgroud)

现在您可以使用此扩展程序将您转换StringNSString第一个然后执行操作.

你的代码将是:

let writePath = NSTemporaryDirectory().stringByAppendingPathComponent("instagram.igo")
Run Code Online (Sandbox Code Playgroud)

这是另一种使用方法:

extension String {  

    var lastPathComponent: String {  
        return (self as NSString).lastPathComponent  
    }  
    var pathExtension: String {  
        return (self as NSString).pathExtension  
    }  
    var stringByDeletingLastPathComponent: String {  
        return (self as NSString).stringByDeletingLastPathComponent  
    }  
    var stringByDeletingPathExtension: String {  
        return (self as NSString).stringByDeletingPathExtension  
    }  
    var pathComponents: [String] {  
        return (self as NSString).pathComponents  
    }  
    func stringByAppendingPathComponent(path: String) -> String {  
        let nsSt = self as NSString  
        return nsSt.stringByAppendingPathComponent(path)  
    }  
    func stringByAppendingPathExtension(ext: String) -> String? {  
        let nsSt = self as NSString  
        return nsSt.stringByAppendingPathExtension(ext)  
    }  
}
Run Code Online (Sandbox Code Playgroud)

来自HERE的参考资料.

对于swift 3.0:

extension String {
    func stringByAppendingPathComponent1(path: String) -> String {
        let nsSt = self as NSString
        return nsSt.appendingPathComponent(path)
    }
}

let writePath = NSTemporaryDirectory().stringByAppendingPathComponent(path: "instagram.igo")


extension String {

    var lastPathComponent: String {
        return (self as NSString).lastPathComponent
    }
    var pathExtension: String {
        return (self as NSString).pathExtension
    }
    var stringByDeletingLastPathComponent: String {
        return (self as NSString).deletingLastPathComponent
    }
    var stringByDeletingPathExtension: String {
        return (self as NSString).deletingPathExtension
    }
    var pathComponents: [String] {
        return (self as NSString).pathComponents
    }
    func stringByAppendingPathComponent(path: String) -> String {
        let nsSt = self as NSString
        return nsSt.appendingPathComponent(path)
    }
    func stringByAppendingPathExtension(ext: String) -> String? {
        let nsSt = self as NSString
        return nsSt.appendingPathExtension(ext)
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 虽然这是一个有效的解决方案,但Apple有必要删除这些方法 - 不推荐使用定位资源的路径,而应使用NSURL.只是说. (11认同)

Jef*_*Neo 30

只需将您的字符串包装为NSString.

let writePath = (NSTemporaryDirectory() as NSString).stringByAppendingPathComponent("instagram.igo")
Run Code Online (Sandbox Code Playgroud)


Vya*_*lav 14

对于Swift 3:

let writePath = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(directoryname).path
Run Code Online (Sandbox Code Playgroud)

或者更好地创建此扩展:

extension String {
    func appendingPathComponent(_ string: String) -> String {
        return URL(fileURLWithPath: self).appendingPathComponent(string).path
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

 let writePath = NSTemporaryDirectory().appendingPathComponent(directoryname)
Run Code Online (Sandbox Code Playgroud)


Rev*_*nth 6

Swift 3解决方案:

这是一个获取文档目录路径的函数 -

    func getDocumentsDirectory() -> URL {
         let paths = FileManager.default.urls(for: .documentDirectory, in:.userDomainMask)
         let documentsDirectory = paths[0]
         return documentsDirectory
     }
Run Code Online (Sandbox Code Playgroud)

如何使用:

    getDocumentsDirectory.appendingPathComponent("google.com")
Run Code Online (Sandbox Code Playgroud)

结果:

    file:///var/folders/w1/3rcp2fvs1qv43hfsh5876s0h0000gn/T/com.apple.dt.Xcode.pg/containers/com.apple.dt.playground.stub.iOS_Simulator.MyPlayground-7CF9F706-509C-4D4C-997E-AB8FE9E4A6EA/Documents/google.com
Run Code Online (Sandbox Code Playgroud)


Meh*_*han 5

对于swift 2.0

// Get the documents Directory
    func documentsDirectory() -> String {
        let documentsFolderPath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0]
        return documentsFolderPath
    }

// Get path for a file in the directory
func fileInDocumentsDirectory(filename: String) -> String {

    let writePath = (documentsDirectory() as NSString).stringByAppendingPathComponent("Mobile")

    if (!NSFileManager.defaultManager().fileExistsAtPath(writePath)) {
        do {
            try NSFileManager.defaultManager().createDirectoryAtPath(writePath, withIntermediateDirectories: false, attributes: nil) }
            catch let error as NSError {
                print(error.localizedDescription);
        }
    }
    return (writePath as NSString).stringByAppendingPathComponent(filename)
}

//# MARK: - Save Image in Doc dir
func saveImage (image: UIImage, path: String ) -> Bool{

    let pngImageData = UIImagePNGRepresentation(image)
    //        let jpgImageData = UIImageJPEGRepresentation(image, 1.0)   // if you want to save as JPEG
    let result = pngImageData!.writeToFile(path, atomically: true)

    print("\(result)")
    print("\(path)")

    return result

}
Run Code Online (Sandbox Code Playgroud)