stringByAppendingPathComponent उपलब्ध नहीं है


132

मेरा ऐप इंस्टाग्राम पर फ़ोटो साझा करता है, ऐसा करने के लिए वह इसे पहले एक अस्थायी निर्देशिका पर सहेजता है:

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

यह काम कर रहा था Swift 1.2, लेकिन काम नहीं कर रहा है Swift 2.0

दिया गया त्रुटि संदेश है:

stringByAppendingPathComponent उपलब्ध नहीं है: इसके बजाय NSURL पर URLByAppendingPathComponent का उपयोग करें।

जवाबों:


145

ऐसा लगता है कि stringByAppendingPathComponentस्विफ्ट 2.0 में विधि को हटा दिया गया है, इसलिए त्रुटि संदेश का उपयोग करना क्या है:

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

अपडेट करें:

URLByAppendingPathComponent()appendingPathComponent()इसके बजाय ऐसा किया गया है:

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

यदि आप इस डिज़ाइन का उपयोग करने जा रहे हैं, तो आपको अंतरिक्ष को% 20 में बदलने की समस्याएँ होंगीApplication%20Support
रोमन

नहीं, स्विफ्ट 2.0 का उपयोग कर सकते हैं stringByAppendingPathComponent, नीचे मेरा जवाब देखें।
जेफरी नियो

2
@ जेफ्रीएनियो हाँ, लेकिन यह एक NSURLतरीका नहीं है, लेकिनNSString
डैनियल नेगी

@ DANielNagy मेरा मतलब है कि आपने कहा " stringByAppendingPathComponentस्विफ्ट 2.0 में हटा दिया गया है" सही नहीं है, और @ मैसम ने केवल NSURLविधि के लिए नहीं पूछा ।
जेफरी नियो

4
@JeffreyNeo वास्तव में, यह सही है, क्योंकि स्विफ्ट 1.2 के स्ट्रिंग में stringByAppendingPathComponent नामक एक विधि थी, लेकिन स्विफ्ट 2.0 का स्ट्रिंग नहीं है। और NSString स्विफ्ट भाषा का हिस्सा नहीं है, यह फाउंडेशन फ्रेमवर्क का हिस्सा है।
डैनियल नागी

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

यहाँ से संदर्भ ।

तेजी से 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
हालांकि यह एक वैध समाधान है, एक कारण है कि ऐप्पल ने उन तरीकों को हटा दिया है - संसाधनों का पता लगाने के लिए रास्तों का उपयोग किया गया है और NSURLइसके बजाय एस का उपयोग किया जाना चाहिए। बस केह रहा हू।
चार्ली मोनरो

टुकड़ा: स्ट्रिंग: (NSString (स्ट्रिंग पथ) .stringByAppendingPathComponent (imageName)) ... अन्यथा, काफी @CharlieMonroe से सहमत थे
Bobjt

1
@CharlieMonroe अगर वास्तव में ऐसा है, तो अभी भी तरीकों का एक गुच्छा क्यों है जो एसडीके में, पथ के रूप में URL को स्वीकार नहीं करते हैं?
जोरिस मैन्स

@ जॉरिसमैन आमतौर पर पुराने तरीके हैं (10.0 के बाद से उपलब्ध हैं, या इसके बाद)। जब से सैंडबॉक्सिंग शुरू की गई थी, उदाहरण के लिए एप्सकॉप बुकमार्क के साथ एक रास्ते पर गुजरने का कोई तरीका नहीं है - आपको इसके बजाय एक URL की आवश्यकता है। Apple एपीआई को अपडेट करने में धीमा है जो केवल मुट्ठी भर लोग उपयोग करते हैं। या क्या आपके पास हाल ही में जोड़े गए एपीआई (पिछले 3-4 साल) का उदाहरण है?
चार्ली मुनरो

1
@IulianOnofrei - चूंकि आप का उपयोग कर किया जाना चाहिए checkResourceIsReachable()या checkPromisedItemIsReachable()पर URLबजाय। स्विफ्ट के लिए हटाए गए उपसर्ग के साथ FileManagerअभी भी एक ओबीजीसी वर्ग है और ओएस एक्स 10.0 के बाद से कभी भी था। दुनिया तब से विकसित हुई है और जैसे-जैसे ऐप सैंडबॉक्स हो गए हैं (जो कि आईओएस पर कम स्पष्ट है), फ़ाइल मौजूद हो सकती है, आपके पास इसे देखने की अनुमति नहीं हो सकती है; इसके अलावा, फ़ाइल क्लाउड में हो सकती है, आदि, यही वजह है कि सरल विधि को कुछ और जटिल के साथ बदल दिया जाता है , लेकिन अधिक शब्दार्थिक रूप से सही। NSFileManagerNSfileExistsAtPathBOOLURL
चार्ली मुनरो

30

बस के रूप में अपनी स्ट्रिंग लपेटो NSString

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

एक शांत .. Stringकक्षा में यह NSStringमौजूद नहीं है! समझ में आता है।
प्रीतम

16

के लिए स्विफ्ट 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

स्विफ्ट 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

तेजी से 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 () का उपयोग कर सकते हैं। कृपया ध्यान दें कि आपको "फ़ाइल: //" उपसर्ग निकालने के लिए पथ स्ट्रिंग को ट्रिम करना चाहिए:

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पथ विधियों ( StringURL विधियों के बजाय ) का उपयोग करना स्वीकार्य है, तो 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)
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.