chuỗiByAppendingPathComponent không khả dụng


132

Ứng dụng của tôi chia sẻ ảnh trên Instagram, để làm điều này trước tiên, nó sẽ lưu nó vào một thư mục tạm thời:

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

Nó đã hoạt động Swift 1.2, nhưng không hoạt động Swift 2.0.

Thông báo lỗi được đưa ra là:

stringByAppendingPathComponent không có sẵn: sử dụng URLByAppendingPathComponent trên NSURL thay thế.

Câu trả lời:


145

Có vẻ như phương thức stringByAppendingPathComponentnày đã bị xóa trong Swift 2.0, vì vậy thông báo lỗi cho thấy là sử dụng:

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

Cập nhật:

URLByAppendingPathComponent()đã được thay thế bằng appendingPathComponent()như vậy thay vì làm:

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

nếu bạn định sử dụng thiết kế này, bạn sẽ gặp vấn đề như chuyển đổi không gian thành% 20Application%20Support
La Mã

không, Swift 2.0 có thể sử dụng stringByAppendingPathComponent, xem câu trả lời của tôi dưới đây.
Jeffrey Neo

2
@JeffreyNeo có, nhưng đó không phải là một NSURLphương pháp mà làNSString
Dániel Nagy

@ DánielNagy Tôi có nghĩa là bạn đã nói " stringByAppendingPathComponentbị xóa trong Swift 2.0" là không chính xác và @Maysam không yêu cầu NSURLphương pháp duy nhất .
Jeffrey Neo

4
@JeffreyNeo thực sự là đúng, vì trong Chuỗi của Swift 1.2 có một phương thức gọi là chuỗiByAppendingPathComponent, nhưng Chuỗi của 2.0 2.0 thì không. Và NSString không phải là một phần của ngôn ngữ Swift, nó là một phần của khung Foundation.
Dániel Nagy

75

Nó hoạt động NSStringđể bạn có thể sử dụng nó như thế này:

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

Bây giờ bạn có thể sử dụng tiện ích mở rộng này sẽ chuyển đổi Stringthành NSStringđầu tiên và sau đó thực hiện thao tác.

Và mã của bạn sẽ là:

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

Đây là một số phương pháp khác để sử dụng:

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

Tham khảo từ ĐÂY .

Đối với 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
Mặc dù đây là một giải pháp hợp lệ, có một lý do tại sao Apple đã loại bỏ các phương pháp đó - sử dụng các đường dẫn để định vị tài nguyên bị phản đối và NSURLthay vào đó nên sử dụng s. Chỉ cần nói.
Charlie Monroe

đoạn trích: Chuỗi (NSString (chuỗi: đường dẫn). ChuỗiByAppendingPathComponent (imageName)) ... nếu không, hoàn toàn đồng ý với
@CharlieMonroe

1
@CharlieMonroe nếu đó thực sự là lý do tại sao vẫn còn một loạt các phương thức không chấp nhận URL làm đường dẫn, trong SDK?
Joris Mans

@JorisMans Đây thường là các phương thức cũ hơn (có sẵn từ 10.0 hoặc sớm hơn). Kể từ khi hộp cát được giới thiệu, không có cách nào đi qua một con đường với ví dụ như dấu trang của ứng dụng - thay vào đó bạn cần một URL. Apple chậm chạp trong việc cập nhật API mà chỉ một số ít người sử dụng. Hay bạn có một ví dụ về API được thêm gần đây (3-4 năm qua)?
Charlie Monroe

1
@IulianOnofrei - Bởi vì bạn nên sử dụng checkResourceIsReachable()hoặc checkPromisedItemIsReachable()trên URLđể thay thế. FileManagervẫn là một lớp ObjC NSFileManagervới NStiền tố được loại bỏ cho Swift và fileExistsAtPathđã có từ OS X 10.0. Thế giới đã phát triển kể từ khi các ứng dụng được đóng hộp cát (điều này ít rõ ràng hơn trên iOS), tệp có thể tồn tại, bạn chỉ có thể không có quyền xem nó; Ngoài ra, tệp có thể nằm trong đám mây, v.v ... Đó là lý do tại sao BOOLphương thức đơn giản được thay thế bằng một cái gì đó phức tạp hơn URL, nhưng chính xác hơn về mặt ngữ nghĩa.
Charlie Monroe

30

Đơn giản chỉ cần quấn chuỗi của bạn là NSString.

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

tuyệt vời .. Stringlớp không có điều này nhưng NSStringtồn tại! có ý nghĩa.
preetam

16

cho Swift 3 :

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

hoặc tốt hơn là tạo phần mở rộng này:

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

sử dụng:

 let writePath = NSTemporaryDirectory().appendingPathComponent(directoryname)

6

Giải pháp Swift 3:

Đây là một chức năng để có được đường dẫn thư mục tài liệu-

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

Cách sử dụng:

    getDocumentsDirectory.appendingPathComponent("google.com")

Kết quả:

    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

Đối với 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

Bạn có thể sử dụng URLByAppendingPathComponent (). Xin lưu ý rằng bạn nên cắt chuỗi đường dẫn để loại bỏ tập tin: // Tiền tố:

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

Làm như sau:

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

0

Tôi đã thử điều này và nó đã giải quyết vấn đề.

trước:

let localPath = documentDirectory.URLByAppendingPathComponent(imageName)

sau:

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

-1

Nếu sử dụng NSStringcác phương thức đường dẫn (thay vì các Stringphương thức URL) có thể chấp nhận được, thì việc mở rộng Stringvới một thuộc tính được tính toán hoặc một phương thức trả về giá trị của nó là NSString(thay vì sao chép các phương thức mong muốn trong Stringphần mở rộng):

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

và sau đó:

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

-2

Swift 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)
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.