ios stringByAppendingPathComponent 不可用

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/32501627/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-31 07:35:23  来源:igfitidea点击:

stringByAppendingPathComponent is unavailable

iosswiftswift2

提问by Maysam

My app shares photo on Instagram, to do this it first saves it on a temporary directory:

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

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

It was working on Swift 1.2, but does not work on Swift 2.0.

它正在工作Swift 1.2,但不工作Swift 2.0

Given error message is:

给定的错误信息是:

stringByAppendingPathComponent is unavailable: use URLByAppendingPathComponent on NSURL instead.

stringByAppendingPathComponent 不可用:在 NSURL 上使用 URLByAppendingPathComponent 代替。

回答by Dániel Nagy

It looks like the method stringByAppendingPathComponentis removed in Swift 2.0, so what the error message suggests is to use:

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

let writePath = NSURL(fileURLWithPath: NSTemporaryDirectory()).URLByAppendingPathComponent("instagram.igo")

Update:

更新:

URLByAppendingPathComponent()has been replaced by appendingPathComponent()so instead do:

URLByAppendingPathComponent()已被替换为appendingPathComponent()所以改为:

let writePath = NSURL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("instagram.igo")

回答by Dharmesh Kheni

It is working for NSStringso you can use it like this:

它正在工作,NSString因此您可以像这样使用它:

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

Now you can use this extension which will convert your Stringto NSStringfirst and then perform operation.

现在您可以使用此扩展程序,它将首先转换StringNSString,然后执行操作。

And your code will be:

你的代码将是:

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

Here is some another methods for use:

下面是一些其他的使用方法:

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

Reference from HERE.

这里参考。

For swift 3.0:

对于 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)
    }
}

回答by Jeffrey Neo

Simply wrap your string as NSString.

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

let writePath = (NSTemporaryDirectory() as NSString).stringByAppendingPathComponent("instagram.igo")

回答by Vyacheslav

for Swift 3:

对于Swift 3

let writePath = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(directoryname).path

or better create this extension:

或者更好地创建这个扩展:

extension String {
    func appendingPathComponent(_ string: String) -> String {
        return URL(fileURLWithPath: self).appendingPathComponent(string).path
    }
}

usage:

用法:

 let writePath = NSTemporaryDirectory().appendingPathComponent(directoryname)

回答by Revanth

Swift 3 Solution:

斯威夫特 3 解决方案:

Here is a function to get the documents directory path-

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

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

How to use:

如何使用:

    getDocumentsDirectory.appendingPathComponent("google.com")

Result:

结果:

    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

回答by Mehul Chuahan

For swift 2.0

快速 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

}

回答by user2374993 - Inbal Tish

You can use URLByAppendingPathComponent() instead. Please note that you should trim the path string to remove “file://“ prefix:

您可以改用 URLByAppendingPathComponent()。请注意,您应该修剪路径字符串以删除“file://”前缀:

let uniqueFileName = NSUUID().UUIDString
let documentsDirectory = getDocumentsDirectoryURL()
    if let path = documentsDirectory?.URLByAppendingPathComponent(uniqueFileName) {
        var pathString = path.absoluteString
        pathString = imagePathString.stringByTrimmingCharactersInSet(NSCharacterSet(charactersInString: "file://"))
}

func getDocumentsDirectoryURL() -> NSURL? {
    let fileManager = NSFileManager()
    if let docsDirectory = fileManager.URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask).first {
        return docsDirectory
    }
    return nil
}

回答by Mauro Delazeri

Do the following:

请执行下列操作:

(("\(fileName)" as NSString).lastPathComponent as NSString).stringByDeletingPathExtension

回答by Anna S.

I tried this and it solved the problem.

我试过了,它解决了这个问题。

before:

前:

let localPath = documentDirectory.URLByAppendingPathComponent(imageName)

after:

后:

let localPath = (documentDirectory as NSString).appendingPathComponent(imageName)

回答by Russian

If using NSStringpath methods (instead of StringURL methods) is acceptable, it's much easier to extend Stringwith a computed property or a method returning its value as NSString(instead of duplicating the desired methods in Stringextension):

如果使用NSString路径方法(而不是StringURL 方法)是可以接受的,那么String使用计算属性或返回其值的方法NSString(而不是在String扩展中复制所需的方法)更容易扩展:

extension String
{
    var ns: NSString { return self as NSString }
}

and then:

进而:

swiftStringPath.ns.appendingPathComponent("whateva")
swiftStringPath.ns.deletingPathExtension