stringByAppendingPathComponent tidak tersedia

132

Aplikasi saya membagikan foto di Instagram, untuk melakukan ini pertama-tama menyimpannya di direktori sementara:

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

Itu bekerja Swift 1.2, tetapi tidak berhasil Swift 2.0.

Pesan kesalahan yang diberikan adalah:

stringByAppendingPathComponent tidak tersedia: gunakan URLByAppendingPathComponent di NSURL sebagai gantinya.

Maysam
sumber

Jawaban:

145

Sepertinya metode stringByAppendingPathComponentini dihapus di Swift 2.0, jadi apa yang disarankan pesan kesalahan adalah menggunakan:

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

Memperbarui:

URLByAppendingPathComponent()telah diganti dengan appendingPathComponent()demikian lakukan:

let writePath = NSURL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("instagram.igo")
Dániel Nagy
sumber
jika Anda akan menggunakan desain ini, Anda akan mengalami masalah seperti mengubah ruang menjadi% 20Application%20Support
Roman
tidak, Swift 2.0 dapat digunakan stringByAppendingPathComponent, lihat jawaban saya di bawah ini.
Jeffrey Neo
2
@JeffreyNeo ya, tapi itu bukan NSURLmetode tetapiNSString
Dániel Nagy
@ DánielNagy Maksud saya Anda mengatakan " stringByAppendingPathComponentdihapus di Swift 2.0" tidak benar, dan @Maysam tidak hanya meminta NSURLmetode.
Jeffrey Neo
4
@JeffreyNeo sebenarnya, itu benar, karena di Swift 1.2's String memiliki metode yang disebut stringByAppendingPathComponent, tetapi Swift 2.0's String tidak. Dan NSString bukan bagian dari bahasa Swift, itu bagian dari kerangka kerja Foundation.
Dániel Nagy
75

Ini berfungsi NSStringagar Anda dapat menggunakannya seperti ini:

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

Sekarang Anda dapat menggunakan ekstensi ini yang akan mengonversi Anda Stringmenjadi yang NSStringpertama dan kemudian melakukan operasi.

Dan kode Anda akan:

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

Berikut adalah beberapa metode lain untuk digunakan:

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

Referensi dari SINI .

Untuk 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)
    }
}
Dharmesh Kheni
sumber
12
Meskipun ini adalah solusi yang valid, ada alasan mengapa Apple telah menghapus metode-metode tersebut - menggunakan jalur untuk mencari sumber daya sudah tidak digunakan lagi dan oleh karenanya NSURLharus digunakan. Hanya mengatakan.
Charlie Monroe
snippet: String (NSString (string: path) .stringByAppendingPathComponent (imageName)) ... jika tidak, cukup setuju dengan @CharlieMonroe
Bobjt
1
@CharlieMonroe jika itu memang benar mengapa masih ada banyak metode yang tidak menerima URL sebagai path, di SDK?
Joris Mans
@ JorisMans Ini biasanya metode yang lebih lama (tersedia sejak 10.0, atau lebih awal setelah). Sejak sandboxing diperkenalkan, tidak ada cara untuk meneruskan jalur dengan mis. Bookmark appscope - Anda memerlukan URL sebagai gantinya. Apple lambat dalam memperbarui API yang hanya digunakan oleh beberapa orang. Atau apakah Anda memiliki contoh API yang baru ditambahkan (3-4 tahun terakhir)?
Charlie Monroe
1
@IulianOnofrei - Karena Anda harus menggunakan checkResourceIsReachable()atau checkPromisedItemIsReachable()pada URLsebaliknya. FileManagermasih kelas ObjC NSFileManagerdengan NSawalan dihapus untuk Swift dan fileExistsAtPathsudah ada sejak OS X 10.0. Dunia telah berevolusi sejak dan karena aplikasi diberi kotak pasir (yang kurang jelas di iOS), file mungkin ada, Anda mungkin tidak memiliki izin untuk melihatnya; juga, file mungkin ada di cloud, dll. Itulah sebabnya BOOLmetode sederhana diganti dengan sesuatu yang lebih rumit URL, tetapi lebih benar secara semantik.
Charlie Monroe
30

Cukup bungkus string Anda sebagai NSString.

let writePath = (NSTemporaryDirectory() as NSString).stringByAppendingPathComponent("instagram.igo")
Jeffrey Neo
sumber
keren .. Stringkelas tidak punya ini tapi NSStringada! masuk akal.
preetam
16

untuk Swift 3 :

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

atau lebih baik buat ekstensi ini:

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

pemakaian:

 let writePath = NSTemporaryDirectory().appendingPathComponent(directoryname)
Vyacheslav
sumber
6

Solusi Swift 3:

Berikut adalah fungsi untuk mendapatkan jalur direktori dokumen

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

Cara Penggunaan:

    getDocumentsDirectory.appendingPathComponent("google.com")

Hasil:

    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
Revanth
sumber
5

Untuk 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

}
Mehul Chuahan
sumber
2

Anda dapat menggunakan URLByAppendingPathComponent () sebagai gantinya. Harap dicatat bahwa Anda harus memotong string path untuk menghapus "file: //" awalan:

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
}
user2374993 - Inbal Tish
sumber
0

Lakukan hal berikut:

(("\(fileName)" as NSString).lastPathComponent as NSString).stringByDeletingPathExtension
Mauro Delazeri
sumber
0

Saya mencoba ini dan itu memecahkan masalah.

sebelum:

let localPath = documentDirectory.URLByAppendingPathComponent(imageName)

setelah:

let localPath = (documentDirectory as NSString).appendingPathComponent(imageName)
Miah G.
sumber
-1

Jika menggunakan NSStringmetode jalur (alih-alih Stringmetode URL) dapat diterima, jauh lebih mudah untuk memperluas Stringdengan properti yang dihitung atau metode yang mengembalikan nilainya sebagai NSString(alih-alih menduplikasi metode yang diinginkan dalam Stringekstensi):

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

lalu:

swiftStringPath.ns.appendingPathComponent("whateva")
swiftStringPath.ns.deletingPathExtension
Rusia
sumber
-2

Cepat 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)
    }
}
Duncan Groenewald
sumber