Ios stringByAppendingPathComponent不可用

Ios stringByAppendingPathComponent不可用,ios,swift,swift2,Ios,Swift,Swift2,我的应用程序在Instagram上共享照片,为此,它首先将照片保存在临时目录中: let writePath = NSTemporaryDirectory().stringByAppendingPathComponent("instagram.igo") 它在Swift 1.2上工作,但在Swift 2.0上不工作 给定的错误消息是: stringByAppendingPathComponent不可用:请改为在NSURL上使用URLByAppendingPathComponent 它适用于NS

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

let writePath = NSTemporaryDirectory().stringByAppendingPathComponent("instagram.igo")
它在
Swift 1.2
上工作,但在
Swift 2.0
上不工作

给定的错误消息是:

stringByAppendingPathComponent不可用:请改为在NSURL上使用URLByAppendingPathComponent


它适用于
NSString
,因此您可以这样使用它:

extension String {
    func stringByAppendingPathComponent(path: String) -> String {
        let nsSt = self as NSString
        return nsSt.stringByAppendingPathComponent(path)
    }
}
现在您可以使用此扩展,它将首先将
字符串
转换为
NSString
,然后执行操作

您的代码将是:

let writePath = NSTemporaryDirectory().stringByAppendingPathComponent("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).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)  
    }  
}
引用自

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

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

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

    getDocumentsDirectory.appendingPathComponent("google.com")
URLByAppendingPathComponent()
已被
appendingPathComponent()
替换,因此请改为:

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

只需将字符串包装为
NSString

let writePath = (NSTemporaryDirectory() as NSString).stringByAppendingPathComponent("instagram.igo")
请执行以下操作:

(("\(fileName)" as NSString).lastPathComponent as NSString).stringByDeletingPathExtension
适用于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

}

您可以改为使用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
}

对于Swift 3

let writePath = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(directoryname).path
或者最好创建此扩展:

extension String {
    func appendingPathComponent(_ string: String) -> String {
        return URL(fileURLWithPath: self).appendingPathComponent(string).path
    }
}
extension String
{
    var ns: NSString { return self as NSString }
}
用法:

 let writePath = NSTemporaryDirectory().appendingPathComponent(directoryname)

Swift 3解决方案:

    getDocumentsDirectory.appendingPathComponent("google.com")
下面是一个获取文档目录路径的函数-

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

    getDocumentsDirectory.appendingPathComponent("google.com")
结果:

    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
斯威夫特4

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

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

然后:

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

我尝试了这个,它解决了问题

之前:

let localPath = documentDirectory.URLByAppendingPathComponent(imageName)
之后:

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

如果您打算使用这种设计,您将遇到诸如将空间转换为%20
应用程序%20支持等问题
否,Swift 2.0可以使用
stringByAppendingPathComponent
,请参见下面的我的答案。@JeffreyNeo是的,但这不是
NSURL
方法,而是
NSString
@DánielNagy我是说的“
stringByAppendingPathComponent
在Swift 2.0中被删除"实际上,这是正确的,因为在SWIFT 1.2的字符串中有一个名为String ByPyEngPultPultCype的方法,但是Swift 2的字符串没有。NSString不是SWIFT语言的一部分,它是基础框架的一部分。虽然这是一个有效的解决方案,但我还是有一个有效的解决方案。这是Apple删除这些方法的原因-不推荐使用路径来定位资源,应该改用
NSURL
s。只需说一下。snippet:String(NSString(String:path)。stringByAppendingPathComponent(imageName))…否则,我完全同意@CharlieMonroe@CharlieMonroe如果真是这样,为什么在SDK中仍然有很多方法不接受URL作为路径?@JorisMans这些方法通常都是较旧的方法(从10.0开始提供,或在10.0之后早期提供).自从引入沙盒以来,就没有办法通过appscope书签等路径传递信息-你需要一个URL。苹果在更新只有少数人使用的API方面很慢。或者你有最近添加的API(过去3-4年)的例子吗?@IulianOnofrei-因为你应该使用
checkResourceIsReachable()
checkPromiseditMisable()
on
URL
取而代之。
FileManager
仍然是一个ObjC类
NSFileManager
,为Swift删除了
NS
前缀,并且自OS X 10.0以来就存在
fileExistsAtPath
。从那时起,随着应用程序的沙盒化,世界也在不断发展(这在iOS上不太明显),文件可能存在,您可能没有查看它的权限;此外,文件可能在云中,等等。这就是为什么简单的
BOOL
方法被
URL
更复杂的方法所取代,但语义更正确。酷的一个..
String
类没有这个,但是
NSString
存在!有意义。