স্ট্রিংবাই অ্যাপেন্ডিংপ্যাথ কম্পোনেন্টটি অনুপলব্ধ


132

আমার অ্যাপ্লিকেশনটি ইনস্টাগ্রামে ফটো ভাগ করে, এটি করতে এটি প্রথমে একটি অস্থায়ী ডিরেক্টরিতে সঞ্চয় করে:

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

এটি কাজ করছিল Swift 1.2, কিন্তু কাজ করে না Swift 2.0

প্রদত্ত ত্রুটি বার্তাটি হ'ল:

স্ট্রিংবাইএপেন্ডিংপ্যাথ কম্পোনেন্টটি অনুপলব্ধ: এর পরিবর্তে এনএসআরএল ইউআরএলবায়পেন্ডিংপ্যাথ কম্পোনেন্ট ব্যবহার করুন।

উত্তর:


145

দেখে মনে হচ্ছে পদ্ধতিটি stringByAppendingPathComponentসুইফট ২.০-তে সরানো হয়েছে, তাই ত্রুটি বার্তায় যা বোঝায় তা ব্যবহার করা উচিত:

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

হালনাগাদ:

URLByAppendingPathComponent()appendingPathComponent()পরিবর্তে তাই দ্বারা প্রতিস্থাপিত হয়েছে :

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

আপনি যদি এই ডিজাইনটি ব্যবহার করতে যাচ্ছেন যে আপনার কাছে স্থানটি% 20 তে রূপান্তর করার মতো সমস্যা হবেApplication%20Support
রোমান

না, সুইফট ২.০ ব্যবহার করতে পারে stringByAppendingPathComponent, নীচে আমার উত্তরটি দেখুন।
জেফরি নিও

2
@ জেফ্রেনিও হ্যাঁ, তবে এটি কোনও NSURLপদ্ধতি নয় তবে একটিNSString
ডানিয়েল নাগি

@ ডানিয়েলনাগি মানে আপনি বলেছেন যে " stringByAppendingPathComponentসুইফট ২.০-তে সরানো হয়েছে" সঠিক নয় এবং @ মাইসাম কেবল NSURLপদ্ধতিটি জিজ্ঞাসা করেননি ।
জেফরি নিও

4
@ জেফ্রেনিও আসলে এটি সঠিক, যেহেতু সুইফট ১.২ এর স্ট্রিং-এ স্ট্রিংবাই অ্যাপেন্ডিংপ্যাথ কম্পোনেন্ট নামে একটি পদ্ধতি ছিল, তবে সুইফট ২.০ এর স্ট্রিং নেই। এবং এনএসএসস্ট্রিং সুইফট ভাষার অংশ নয়, এটি ফাউন্ডেশন কাঠামোর অংশ।
ডানিয়েল নাগি

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এর পরিবর্তে গুলি ব্যবহার করা উচিত। কথা মাত্র.
চার্লি মনরো

স্নিপেট: স্ট্রিং (এনএসএসস্ট্রিং (স্ট্রিং: পাথ)। স্ট্রিংবাই অ্যাপেন্ডিংপ্যাথ কম্পোনেন্ট (ইমেজনাম)) ... অন্যথায় @CharlieMonroe এর সাথে বেশ সম্মত হয়েছে
ববজট

1
@ চর্লিমনরো যদি সত্যিই এটি হয় তবে কেন এখনও এমন অনেকগুলি পদ্ধতি রয়েছে যা কোনও ইউআরএলকে পথ হিসাবে গ্রহণ করে না, এসডিকে?
জোরিস মানস

@ জরিসম্যানস এগুলি সাধারণত পুরানো পদ্ধতি (10.0 এর পরে বা তার প্রথমদিকে পাওয়া যায়)। যখন থেকে স্যান্ডবক্সিং চালু হয়েছিল, তখন থেকেই উদাহরণস্বরূপ অ্যাপস্কোপ বুকমার্ক সহ কোনও পাথে যাওয়ার কোনও উপায় নেই - এর পরিবর্তে আপনার একটি URL দরকার need অ্যাপল কেবলমাত্র মুষ্টিমেয় লোকেরা ব্যবহার করে এমন এপিআই আপডেট করতে ধীর। বা আপনার কাছে সম্প্রতি যুক্ত হওয়া এপিআই (গত 3-4 বছর) এর উদাহরণ রয়েছে?
চার্লি মনরো

1
@IulianOnofrei - কারণ আপনি ব্যবহার হওয়া উচিত checkResourceIsReachable()বা checkPromisedItemIsReachable()উপর URLপরিবর্তে। FileManagerএখনও একটি ওবিজেসি ক্লাস NSFileManagerযা NSসুইফটের জন্য উপসর্গটি মুছে ফেলা হয়েছে এবং fileExistsAtPathওএস এক্স 10.0 এর পরে থেকেই রয়েছে। অ্যাপ্লিকেশনগুলি স্যান্ডবক্সযুক্ত হওয়ার পর থেকেই বিশ্বটি বিকশিত হয়েছে (যা আইওএসের তুলনায় কম স্পষ্ট) ফাইলটি উপস্থিত থাকতে পারে, আপনার এটি দেখার অনুমতি নাও থাকতে পারে; এছাড়াও ফাইলটি ক্লাউডে থাকতে পারে ইত্যাদি কারণেই সহজ BOOLপদ্ধতিটি আরও জটিল কিছু দিয়ে প্রতিস্থাপন করা হয়েছে URLতবে শব্দার্থগতভাবে আরও সঠিক।
চার্লি মনরো

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

আপনি এর পরিবর্তে ইউআরএলপ্লায়েন্টিংপথ কম্পোনেন্ট () ব্যবহার করতে পারেন। দয়া করে মনে রাখবেন যে "ফাইল: //" উপসর্গটি সরাতে আপনার পাথ স্ট্রিংটি ছাঁটা উচিত:

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পাথের পদ্ধতিগুলি ( Stringইউআরএল পদ্ধতির পরিবর্তে ) গ্রহণযোগ্য হয়, তবে 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)
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.