stringByAppendingPathComponent ไม่พร้อมใช้งาน


132

แอพของฉันแชร์รูปภาพบน Instagram โดยจะบันทึกลงในไดเรกทอรีชั่วคราวก่อน:

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

มันกำลังทำงานอยู่แต่ไม่ทำงานบนSwift 1.2Swift 2.0

ข้อความแสดงข้อผิดพลาดที่ระบุคือ:

stringByAppendingPathComponent ไม่พร้อมใช้งาน: ใช้ URLByAppendingPathComponent บน NSURL แทน

คำตอบ:


145

ดูเหมือนว่าวิธีstringByAppendingPathComponentนี้จะถูกลบออกใน Swift 2.0 ดังนั้นสิ่งที่ข้อความแสดงข้อผิดพลาดแนะนำคือให้ใช้:

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

อัปเดต:

URLByAppendingPathComponent()ถูกแทนที่ด้วยappendingPathComponent()ดังนั้นให้ทำ:

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

หากคุณจะใช้การออกแบบนี้คุณจะมีปัญหาเช่นแปลงพื้นที่เป็น% 20Application%20Support
โรมัน

ไม่ Swift 2.0 สามารถใช้ได้stringByAppendingPathComponentดูคำตอบของฉันด้านล่าง
Jeffrey Neo

2
@JeffreyNeo ใช่ แต่นั่นไม่ใช่NSURLวิธีการ แต่เป็นNSString
Dániel Nagy

@ DánielNagyฉันหมายความว่าคุณบอกว่า " stringByAppendingPathComponentถูกลบใน Swift 2.0" นั้นไม่ถูกต้องและ @Maysam ไม่ได้ขอเพียงNSURLวิธีการเท่านั้น
Jeffrey Neo

4
@JeffreyNeo ที่จริงมันถูกต้องเนื่องจากใน String ของ Swift 1.2 มีเมธอดที่เรียกว่า stringByAppendingPathComponent แต่ String ของ Swift 2.0 ไม่มี และ NSString ไม่ได้เป็นส่วนหนึ่งของภาษา Swift แต่เป็นส่วนหนึ่งของกรอบงาน Foundation
Dániel Nagy

75

มันใช้งานได้เพื่อNSStringให้คุณสามารถใช้งานได้ดังนี้:

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

ตอนนี้คุณสามารถใช้ส่วนขยายนี้ซึ่งจะแปลงของคุณStringไป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)
    }
}

12
แม้ว่านี่จะเป็นวิธีแก้ปัญหาที่ถูกต้อง แต่ก็มีเหตุผลที่ Apple ได้ลบวิธีการเหล่านั้นออก - การใช้เส้นทางไปยังการค้นหาแหล่งข้อมูลนั้นเลิกใช้แล้วและNSURLควรใช้แทน แค่พูด.
Charlie Monroe

snippet: String (NSString (string: path) .stringByAppendingPathComponent (imageName)) ... มิฉะนั้นค่อนข้างเห็นด้วยกับ @CharlieMonroe
Bobjt

1
@CharlieMonroe ถ้าเป็นเช่นนั้นจริงทำไมยังมีวิธีการมากมายที่ไม่ยอมรับ URL เป็นเส้นทางใน SDK?
Joris Mans

@JorisMans เหล่านี้มักเป็นวิธีการที่เก่ากว่า (ใช้ได้ตั้งแต่ 10.0 หรือเร็วกว่านั้น) นับตั้งแต่มีการเปิดตัวแซนด์บ็อกซ์ไม่มีวิธีใดในการส่งต่อเส้นทางด้วยเช่นที่คั่นหน้า appscope คุณต้องใช้ URL แทน Apple อัปเดต API ช้าซึ่งมีเพียงไม่กี่คนเท่านั้นที่ใช้ หรือคุณมีตัวอย่าง API ที่เพิ่งเพิ่ม (3-4 ปีที่ผ่านมา)?
Charlie Monroe

1
@IulianOnofrei - เพราะคุณควรใช้checkResourceIsReachable()หรือcheckPromisedItemIsReachable()เปิดURLแทน FileManagerยังคงเป็นคลาส ObjC NSFileManagerโดยNSนำคำนำหน้าออกสำหรับ Swift และfileExistsAtPathเคยมีมาตั้งแต่ OS X 10.0 โลกมีการพัฒนาตั้งแต่นั้นเป็นต้นมาและเนื่องจากแอปเป็นแซนด์บ็อกซ์ (ซึ่งไม่ค่อยชัดเจนใน iOS) ไฟล์อาจมีอยู่คุณอาจไม่ได้รับอนุญาตให้ดู นอกจากนี้ไฟล์อาจอยู่ในระบบคลาวด์เป็นต้นด้วยเหตุBOOLนี้วิธีการง่ายๆจึงถูกแทนที่ด้วยสิ่งที่ซับซ้อนURLกว่า แต่ถูกต้องตามความหมายมากกว่า
Charlie Monroe

30

NSStringเพียงแค่ตัดสายของคุณเป็น

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

เจ๋งมาก .. Stringชั้นไม่มี แต่NSStringมีอยู่! มีเหตุผล.
preetam

16

สำหรับSwift 3 :

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

หรือดีกว่าสร้างส่วนขยายนี้:

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

การใช้งาน:

 let writePath = NSTemporaryDirectory().appendingPathComponent(directoryname)

6

โซลูชัน Swift 3:

นี่คือฟังก์ชั่นรับพา ธ ไดเร็กทอรีเอกสาร -

    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

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

}

2

คุณสามารถใช้ 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
}


0

ฉันลองสิ่งนี้และมันแก้ปัญหาได้

ก่อน:

let localPath = documentDirectory.URLByAppendingPathComponent(imageName)

หลังจาก:

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

-1

หากยอมรับวิธีการใช้NSStringเส้นทาง (แทนStringวิธี URL) การขยายStringด้วยคุณสมบัติที่คำนวณได้ง่ายกว่ามากหรือวิธีที่ส่งคืนค่าเป็นNSString(แทนที่จะทำซ้ำวิธีการที่ต้องการในStringส่วนขยาย):

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

แล้ว:

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

-2

สวิฟต์ 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)
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.