stringByAppendingPathComponent kullanılamıyor


132

Uygulamam Instagram'da fotoğraf paylaşıyor, bunu yapmak için önce geçici bir dizine kaydediyor:

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

Üzerinde çalışıyordu Swift 1.2ama çalışmıyor Swift 2.0.

Verilen hata mesajı:

stringByAppendingPathComponent kullanılamıyor: bunun yerine NSURL'de URLByAppendingPathComponent kullanın.

Yanıtlar:


145

Yöntem stringByAppendingPathComponentSwift 2.0'da kaldırılmış gibi görünüyor , bu yüzden hata mesajının önerdiği şey şunu kullanmak:

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

Güncelleme:

URLByAppendingPathComponent()ile değiştirilmiştir, appendingPathComponent()bunun yerine şunu yapın:

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

Bu tasarımı kullanacaksanız, alanı% 20'ye çevirmek gibi sorunlar yaşayacaksınızApplication%20Support
— Roman

hayır, Swift 2.0 kullanabilir stringByAppendingPathComponent, aşağıdaki cevabıma bakın.
— Jeffrey Neo

2
@JeffreyNeo evet, ama bu bir NSURLyöntem değil, birNSString
— Dániel Nagy

@ DánielNagy " stringByAppendingPathComponentSwift 2.0'da kaldırıldı " demişsiniz demek doğru değil ve @Maysam tek NSURLyöntem istemedi .
— Jeffrey Neo

4
@JeffreyNeo aslında doğrudur, çünkü Swift 1.2'nin String'de stringByAppendingPathComponent adında bir yöntem vardı, ancak Swift 2.0'ın String'i yok. NSString, Swift dilinin bir parçası değil, Foundation çerçevesinin bir parçasıdır.
— Dániel Nagy

75

Şu NSStringşekilde kullanabilmeniz için çalışıyor :

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

Artık dönüştürür bu uzantıyı kullanabilirsiniz Stringiçin NSStringilk ve daha sonra işlemi gerçekleştirmek.

Ve kodunuz şöyle olacak:

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

İşte kullanım için bazı başka yöntemler:

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

BURADAN Referans .

Swift 3.0 için:

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
Bu geçerli bir çözüm olsa da, Apple'ın bu yöntemleri kaldırmasının bir nedeni vardır - kaynakları bulmak için yollar kullanmak artık kaldırılmıştır ve NSURLonun yerine s kullanılmalıdır. Sadece söylüyorum.
— Charlie Monroe

snippet: String (NSString (string: path) .stringByAppendingPathComponent (imageName)) ... aksi takdirde @CharlieMonroe ile oldukça anlaştık
— Bobjt

1
@CharlieMonroe eğer gerçekten durum buysa, SDK'da neden hala bir URL'yi yol olarak kabul etmeyen bir sürü yöntem var?
— Joris Mans

@JorisMans Bunlar genellikle daha eski yöntemlerdir (10.0'dan beri veya daha sonra kullanılabilir). Korumalı alan kullanıma sunulduğundan beri, örneğin appscope yer işaretiyle bir yola geçmenin bir yolu yoktur - bunun yerine bir URL'ye ihtiyacınız vardır. Apple, yalnızca birkaç kişinin kullandığı API'leri güncellemede yavaş. Ya da yeni eklenen bir API örneğiniz var mı (son 3-4 yıl)?
— Charlie Monroe

1
@IulianOnofrei - Kullandığınız olmalıdır Çünkü checkResourceIsReachable()ya checkPromisedItemIsReachable()üzerine URLyerine. FileManagerHala bir ObjC sınıfıdır NSFileManagerve NSSwift için ön ek kaldırılmıştır ve fileExistsAtPathOS X 10.0'dan beri oradaydı. O zamandan beri dünya gelişti ve uygulamalar korumalı alana alındıkça (iOS'ta bu daha az belirgindir), dosya var olabilir, onu görüntüleme izniniz olmayabilir; ayrıca, dosya bulutta olabilir, vb. Bu nedenle basit BOOLyöntemin yerine daha karmaşık URL, ancak anlamsal olarak daha doğru olan bir yöntem kullanılır .
— Charlie Monroe

30

Dizinizi NSString.

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

havalı bir .. Stringsınıf buna sahip değil ama NSStringvar! mantıklı.
— 2016

16

için Swift 3 :

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

veya daha iyisi bu uzantıyı oluşturun:

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

kullanımı:

 let writePath = NSTemporaryDirectory().appendingPathComponent(directoryname)

6

Swift 3 Çözümü:

İşte belgeler dizini yolunu almak için bir işlev.

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

Nasıl kullanılır:

    getDocumentsDirectory.appendingPathComponent("google.com")

Sonuç:

    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 için

// 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

Bunun yerine URLByAppendingPathComponent () kullanabilirsiniz. Lütfen "file: //" önekini kaldırmak için yol dizesini kırpmanız gerektiğini unutmayın:

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

Aşağıdakileri yapın:

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

0

Bunu denedim ve sorunu çözdü.

önce:

let localPath = documentDirectory.URLByAppendingPathComponent(imageName)

sonra:

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

-1

Kullanılıyorsa NSString(yerine yol yöntemleri StringURL yöntemler), kabul edilebilir, bir uzatma için çok daha kolay Stringbir bilgisayarlı özelliği ya da değerini geri bir yöntem ile NSString(bunun yerine istenen yöntemleri çoğaltma Stringuzantısı):

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

ve sonra:

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)
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.