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.