আমি কীভাবে সুইফটে অভিধান হিসাবে একটি প্লিস্ট পেতে পারি?


197

আমি অ্যাপলের নতুন সুইফ্ট প্রোগ্রামিং ভাষার সাথে ঘুরে বেড়াচ্ছি এবং কিছু সমস্যা আছে ...

বর্তমানে আমি প্লিস্ট ফাইলটি পড়ার চেষ্টা করছি, অবজেক্টিভ-সিতে এনএসডি অভিধান হিসাবে সামগ্রীটি পেতে নিম্নলিখিতগুলি করব:

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Config" ofType:@"plist"];
NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:filePath];

আমি কীভাবে সুইফটে অভিধান হিসাবে একটি প্লিস্ট পেতে পারি?

আমি ধরে নিই যে আমি প্লাস্টারের সাথে এটির পথ পেতে পারি:

let path = NSBundle.mainBundle().pathForResource("Config", ofType: "plist")

যখন এটি কাজ করে (যদি এটি সঠিক হয়?): অভিধান হিসাবে আমি কীভাবে সামগ্রীটি পেতে পারি?

আরও একটি সাধারণ প্রশ্ন:

ডিফল্ট এনএস * ক্লাস ব্যবহার করা কি ঠিক ? আমার মনে হয় ... বা আমি কিছু মিস করছি? আমি যতদূর জানি ডিফল্ট ফ্রেমওয়ার্ক এনএস * ক্লাসগুলি এখনও বৈধ এবং ব্যবহারের জন্য ঠিক আছে?


উত্তরটি আর বৈধ নয়, আপনি কি দয়া করে অশোকের উত্তরটি নির্বাচন করতে পারবেন?
রোডলফো অ্যান্টোনিসি

উত্তর:


51

ইন দ্রুতগতি 3.0 plist থেকে পড়া।

func readPropertyList() {
        var propertyListFormat =  PropertyListSerialization.PropertyListFormat.xml //Format of the Property List.
        var plistData: [String: AnyObject] = [:] //Our data
        let plistPath: String? = Bundle.main.path(forResource: "data", ofType: "plist")! //the path of the data
        let plistXML = FileManager.default.contents(atPath: plistPath!)!
        do {//convert the data to a dictionary and handle errors.
            plistData = try PropertyListSerialization.propertyList(from: plistXML, options: .mutableContainersAndLeaves, format: &propertyListFormat) as! [String:AnyObject]

        } catch {
            print("Error reading plist: \(error), format: \(propertyListFormat)")
        }
    }

আরও পড়ুন সুইফটে কীভাবে ব্যক্তিগত তালিকাগুলি (.প্লাইস্ট) ব্যবহার করবেন


Askok। এর উপর আজ এইটির উত্তর খোঁজার চেষ্টা করে অনেক ঘন্টা হারিয়েছি! ধন্যবাদ!! এটি পুরোপুরি কাজ করেছে !!!
ব্যবহারকারী 3069232

281

আপনি এখনও সুইফটে এনএসডিক্টরিজ ব্যবহার করতে পারেন:

সুইফট 4 এর জন্য

 var nsDictionary: NSDictionary?
 if let path = Bundle.main.path(forResource: "Config", ofType: "plist") {
    nsDictionary = NSDictionary(contentsOfFile: path)
 }

সুইফ্ট 3+ এর জন্য

if let path = Bundle.main.path(forResource: "Config", ofType: "plist"),
   let myDict = NSDictionary(contentsOfFile: path){
    // Use your myDict here
}

এবং সুইফটের পুরানো সংস্করণ

var myDict: NSDictionary?
if let path = NSBundle.mainBundle().pathForResource("Config", ofType: "plist") {
    myDict = NSDictionary(contentsOfFile: path)
}
if let dict = myDict {
    // Use your dict here
}

এনএসসি ক্লাসগুলি সুইফটে ব্যবহারের জন্য এখনও উপলব্ধ এবং পুরোপুরি সূক্ষ্ম। আমি মনে করি তারা শিগগিরই দ্রুত পরিবর্তনটির দিকে ফোকাস বদলাতে চাইবে, তবে বর্তমানে সুইফট এপিআই-এর মূল এনএসসি ক্লাসের সমস্ত কার্যকারিতা নেই।


হুম আমি যখন আপনার সরবরাহ করা কোডটি ব্যবহার করার চেষ্টা করি তখন আমি ত্রুটিটি পাই:
এক্সএক্সএক্সের

এটি খেলার মাঠের ক্ষেত্রে দুর্দান্ত কাজ করে। শুধু আমার দ্রুত নথিতে নয়
কেনেভিবি

কেমন লাগছে অ্যারে থাকলে?
আর্নলি ভিজকায়নো

দেখে মনে mainBundle()হচ্ছে ঠিক mainসুইফট 3
বালপয়েন্টবিউন

8
এই উত্তরটি পুরানো। এমনকি সুইফ্ট 3-এ আপনার সম্পত্তি তালিকা ডেটা পড়ার জন্য মোটেও ব্যবহার NSArray/NSDictionaryকরা উচিত নয়PropertyListSerialization(এবং সুইফ্ট 4 বিকল্পে Codableপ্রোটোকল) উপযুক্ত এপিআই। এটি আধুনিক ত্রুটি হ্যান্ডলিং সরবরাহ করে এবং ডেটা সরাসরি নেটিভ সুইফ্ট সংগ্রহের ধরণে রূপান্তর করা যায়।
ভাদিয়ান

141

আমি যদি একটি .প্লাস্টিককে একটি সুইফট অভিধানে রূপান্তর করতে চাই তবে আমি এটি করি:

if let path = NSBundle.mainBundle().pathForResource("Config", ofType: "plist") {
  if let dict = NSDictionary(contentsOfFile: path) as? Dictionary<String, AnyObject> {
    // use swift dictionary as normal
  }
}

সুইফট ২.০ এর জন্য সম্পাদিত:

if let path = NSBundle.mainBundle().pathForResource("Config", ofType: "plist"), dict = NSDictionary(contentsOfFile: path) as? [String: AnyObject] {
    // use swift dictionary as normal
}

সুইফট 3.0 এর জন্য সম্পাদিত:

if let path = Bundle.main.path(forResource: "Config", ofType: "plist"), let dict = NSDictionary(contentsOfFile: path) as? [String: AnyObject] {
        // use swift dictionary as normal
}

3
আমি মনে করি এটি করার কোনও দেশীয় দ্রুত উপায় না হওয়া পর্যন্ত এটি গুচ্ছটির "সবচেয়ে সঠিক" উত্তর।
ডিউডঅনরক

1
এই উত্তরটি পুরানো। সুইফ্ট 3 এ আপনার সম্পত্তি তালিকার ডেটা পড়ার জন্য মোটেও ব্যবহার NSArray/NSDictionaryকরা উচিত নয়PropertyListSerialization(এবং সুইফ্ট 4 বিকল্পে Codableপ্রোটোকল) উপযুক্ত এপিআই। এটি আধুনিক ত্রুটি হ্যান্ডলিং সরবরাহ করে এবং ডেটা সরাসরি নেটিভ সুইফ্ট সংগ্রহের ধরণে রূপান্তর করা যায়।
ভাদিয়ান

47

সুইফট 4.0

আপনি এখন একটি কাস্টম স্ট্রাক্টে .plist ডিকোড করতে ডিকোডেবল প্রোটোকল ব্যবহার করতে পারেন। আমি আরও জটিল। প্লেট স্ট্রাকচারগুলির জন্য আমি ডিকোডেবল / এনকোডেবলগুলি পড়ার প্রস্তাব দিই (একটি ভাল উত্স এখানে রয়েছে: https://benscheimar.com/2017/06/swift-json/ ) over

প্রথমে আপনার .plist ফাইলের ফর্ম্যাটে আপনার কাঠামো সেটআপ করুন। এই উদাহরণের জন্য আমি একটি মূল স্তরের অভিধান এবং 3 টি এন্ট্রি সহ একটি তালিকাভুক্ত তালিকা বিবেচনা করব: 1 "কী" নামের সাথে স্ট্রিং, কী "বয়স" এর সাথে 1 টি এবং কী "একক" সহ 1 বুলিয়ান। এখানে স্ট্রাক্ট:

struct Config: Decodable {
    private enum CodingKeys: String, CodingKey {
        case name, age, single
    }

    let name: String
    let age: Int
    let single: Bool
}

যথেষ্ট সহজ। এখন শীতল অংশ। প্রপার্টিলিস্টডেকোডার ক্লাস ব্যবহার করে আমরা সহজেই এই স্ট্রাক্টের ইনস্ট্যান্টেশনে .plist ফাইলটি পার্স করতে পারি:

func parseConfig() -> Config {
    let url = Bundle.main.url(forResource: "Config", withExtension: "plist")!
    let data = try! Data(contentsOf: url)
    let decoder = PropertyListDecoder()
    return try! decoder.decode(Config.self, from: data)
}

চিন্তার মতো বেশি কোড নয় এবং এটি সমস্ত সুইফটে রয়েছে। আরও ভাল তবে এখন আমাদের কাছে কনফিগার স্ট্রাক্টের একটি ইনস্ট্যান্টেশন রয়েছে যা আমরা সহজেই ব্যবহার করতে পারি:

let config = parseConfig()
print(config.name) 
print(config.age)
print(config.single) 

এটি .plist এ "নাম", "বয়স" এবং "একক" কীগুলির জন্য মান মুদ্রণ করে।


1
এটি সুইফট ৪ এর সেরা উত্তর answer তবে কেন Bundle.main.url(forResource: "Config", withExtension: "plist")এবং পরিত্রাণ পাবেন না URL(fileURLWithPath? এবং ফাইলটি বিদ্যমান থাকার জন্য (ডিজাইন / সংকলনের সময়) সমস্ত মান জোর করে মোড়ানো হতে পারে। সবকিছু ঠিকঠাকভাবে ডিজাইন করা থাকলে কোডটি ক্রাশ করা উচিত নয়।
ভাদিয়ান

@ ভাদিয়ান নিশ্চিত যে আপনি ব্যবহার করতে পারেন url(forResource: "Config", withExtension: "plist")আমি তুলনামূলক বিন্দু হিসাবে ওপি তাদের কোডটিতে যা করেছি ঠিক তার সাথে মিলছিলাম । যতদূর পর্যন্ত সবকিছু মোড়কে নেওয়া, আমি সতর্কতার দিক থেকে ভুল করার চেষ্টা করি। আমি মনে করি এটি সাধারণভাবে সুইফ্টের জন্য একটি মৌলিক প্রশ্ন। আমি বরং জানতাম আমার কোড ক্রাশের চেয়ে কোনও পরিস্থিতিতে কী করবে।
একেরলফ

1) দয়া করে আরও উপযুক্ত এপিআই থাকলে খারাপ অভ্যাসগুলি গ্রহণ করবেন না। 2) এটি এমন কয়েকটি ক্ষেত্রে একটি যেখানে বাধ্যতামূলক ক্রাশ ডিজাইনের ত্রুটি আবিষ্কার করে। সংকলনের সময় বান্ডলে থাকা কোনও ফাইলের উপস্থিতি প্রয়োজন এবং রানটাইম এ পরিবর্তন করা যায় না কারণ সমস্ত ফাইল কোড-স্বাক্ষরিত। আবারও: সবকিছু সঠিকভাবে ডিজাইন করা থাকলে কোড অবশ্যই ক্র্যাশ হবে না
ভাদিয়ান

হ্যাঁ আপনি আপনার অধিকার জানেন। বুঝতে পারিনি যে বান্ডিল সংস্থানগুলির ক্ষেত্রে এটি ছিল।
একেরলফ 9'18

2
@NaveenGeorgeThoppan যদি আপনি আপনার অভিধান হিসাবে এই উদাহরণে ব্যবহার তারপর এটি সহজভাবে হবে decoder.decode([Config].self, from: data)। ([কনফিগ] এর আশেপাশে বন্ধনীগুলি লক্ষ্য করুন)
একরলফ

22

এই উত্তরটি এনএসডিকোরিয়ানের পরিবর্তে সুইফট দেশীয় বস্তুগুলি ব্যবহার করে।

সুইফট 3.0

//get the path of the plist file
guard let plistPath = Bundle.main.path(forResource: "level1", ofType: "plist") else { return }
//load the plist as data in memory
guard let plistData = FileManager.default.contents(atPath: plistPath) else { return }
//use the format of a property list (xml)
var format = PropertyListSerialization.PropertyListFormat.xml
//convert the plist data to a Swift Dictionary
guard let  plistDict = try! PropertyListSerialization.propertyList(from: plistData, options: .mutableContainersAndLeaves, format: &format) as? [String : AnyObject] else { return }
//access the values in the dictionary 
if let value = plistDict["aKey"] as? String {
  //do something with your value
  print(value)
}
//you can also use the coalesce operator to handle possible nil values
var myValue = plistDict["aKey"] ?? ""

এটির কি সংক্ষিপ্ত সংস্করণ আছে?
কঠোর_ভি

18

আমি সুইফট 3.0.০ এর সাথে কাজ করছি এবং আপডেট সিনট্যাক্সের জন্য একটি উত্তর অবদান রাখতে চেয়েছিলাম। অতিরিক্ত হিসাবে এবং সম্ভবত আরও গুরুত্বপূর্ণভাবে, আমি ভারী উত্তোলনটি করতে প্রপার্টিলিস্টেরিয়ালাইজেশন অবজেক্টটি ব্যবহার করছি , এটি কেবল এনএসডি অভিধান ব্যবহার করার চেয়ে অনেক বেশি নমনীয় কারণ এটি অ্যারে প্লাস্টের মূল ধরণের হিসাবে মঞ্জুরি দেয়।

নীচে আমি যে প্লাস্টটি ব্যবহার করছি তার একটি স্ক্রিনশট রয়েছে। এটি সামান্য জটিল, যাতে উপলব্ধ পাওয়ারটি প্রদর্শিত হয় তবে এটি প্লাস্টের ধরণের যে কোনও অনুমতিযোগ্য সংমিশ্রনের জন্য কাজ করবে।

নমুনা plist ফাইল আপনি দেখতে পাচ্ছেন যে আমি ওয়েবসাইটের নাম এবং তাদের সম্পর্কিত URL এর তালিকা সঞ্চয় করতে স্ট্রিংয়ের একটি অ্যারে ব্যবহার করছি: স্ট্রিং অভিধানগুলি।

আমার উপরে ভারী উত্তোলন করতে আমি উপরে বর্ণিত হিসাবে সম্পত্তি সম্পত্তি তালিকা ব্যবহার করছি । তদ্ব্যতীত, সুইফট 3.0 আরও "সুইফটি" হয়ে গেছে ফলে সমস্ত বস্তুর নাম "এনএস" উপসর্গ হারিয়েছে।

let path = Bundle.main().pathForResource("DefaultSiteList", ofType: "plist")!
let url = URL(fileURLWithPath: path)
let data = try! Data(contentsOf: url)
let plist = try! PropertyListSerialization.propertyList(from: data, options: .mutableContainers, format: nil)

উপরের কোড রানের পরে plistটাইপ হবে Array<AnyObject>, তবে আমরা জানি এটি আসলে কী ধরণের তাই আমরা এটিকে সঠিক ধরণে ফেলে দিতে পারি:

let dictArray = plist as! [[String:String]]
// [[String:String]] is equivalent to Array< Dictionary<String, String> >

এবং এখন আমরা আমাদের অ্যারে স্ট্রিংয়ের বিভিন্ন বৈশিষ্ট্যগুলি: প্রাকৃতিক উপায়ে স্ট্রিং ডিকোচারগুলি অ্যাক্সেস করতে পারি। আশা করি এগুলি সত্যিকারের দৃ strongly়ভাবে টাইপযুক্ত স্ট্রাক্ট বা ক্লাসে রূপান্তর করতে হবে;)

print(dictArray[0]["Name"])

8

নেটিভ অভিধান এবং অ্যারেগুলি ব্যবহার করা সবচেয়ে ভাল কারণ তারা দ্রুত ব্যবহারের জন্য অনুকূলিত হয়েছে। বলা হচ্ছে যে আপনি দ্রুতগতিতে এনএস ... ক্লাস ব্যবহার করতে পারেন এবং আমি মনে করি যে এই পরিস্থিতিটি তার পুনরুদ্ধার করে। আপনি এটি কীভাবে বাস্তবায়ন করবেন তা এখানে:

var path = NSBundle.mainBundle().pathForResource("Config", ofType: "plist")
var dict = NSDictionary(contentsOfFile: path)

এখন অবধি (আমার মতে) এটি একটি প্লিস্ট অ্যাক্সেস করার সবচেয়ে সহজ এবং সবচেয়ে কার্যকর উপায়, তবে ভবিষ্যতে আমি আশা করি যে অ্যাপল স্থানীয় অভিধানগুলিতে আরও কার্যকারিতা যুক্ত করবে (যেমন প্লিস্ট ব্যবহার করে))


যতদূর আপনি জানেন, নেটিভ ডিকশনারিগুলিতে প্লাস্টিং পড়া ইতিমধ্যে ঘটেছে?
স্পেসিরিচোচেট

8

সুইফ্ট - পড়ুন / লেখার প্লাস্টি এবং পাঠ্য ফাইলটি ....

override func viewDidLoad() {
    super.viewDidLoad()

    let fileManager = (NSFileManager .defaultManager())
    let directorys : [String]? = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory,NSSearchPathDomainMask.AllDomainsMask, true) as? [String]

    if (directorys != nil){
        let directories:[String] = directorys!;
        let dictionary = directories[0]; //documents directory


        //  Create and insert the data into the Plist file  ....
        let plistfile = "myPlist.plist"
        var myDictionary: NSMutableDictionary = ["Content": "This is a sample Plist file ........."]
        let plistpath = dictionary.stringByAppendingPathComponent(plistfile);

        if !fileManager .fileExistsAtPath(plistpath){//writing Plist file
            myDictionary.writeToFile(plistpath, atomically: false)
        }
        else{            //Reading Plist file
            println("Plist file found")

            let resultDictionary = NSMutableDictionary(contentsOfFile: plistpath)
            println(resultDictionary?.description)
        }


        //  Create and insert the data into the Text file  ....
        let textfile = "myText.txt"
        let sampleText = "This is a sample text file ......... "

        let textpath = dictionary.stringByAppendingPathComponent(textfile);
        if !fileManager .fileExistsAtPath(textpath){//writing text file
            sampleText.writeToFile(textpath, atomically: false, encoding: NSUTF8StringEncoding, error: nil);
        } else{
            //Reading text file
            let reulttext  = String(contentsOfFile: textpath, encoding: NSUTF8StringEncoding, error: nil)
            println(reulttext)
        }
    }
    else {
        println("directory is empty")
    }
}

8

সুইফট ২.০: তথ্য.প্লেস্ট অ্যাক্সেস করা

আমার কাছে কোচমার্কস ডিকোরিয়ানো নামের একটি অভিধান রয়েছে ইনফো.পুলিস্টে বুলিয়ান মান সহ। আমি বুল মানটি অ্যাক্সেস করতে এবং এটি সত্য করতে চাই।

let path = NSBundle.mainBundle().pathForResource("Info", ofType: "plist")!
  let dict = NSDictionary(contentsOfFile: path) as! [String: AnyObject]

  if let CoachMarksDict = dict["CoachMarksDictionary"] {
       print("Info.plist : \(CoachMarksDict)")

   var dashC = CoachMarksDict["DashBoardCompleted"] as! Bool
    print("DashBoardCompleted state :\(dashC) ")
  }

লিখতে লিখতে:

একটি কাস্টম প্লিস্ট থেকে: - (ফাইল-নতুন-ফাইল-রিসোর্স-প্রপার্টিলিস্ট থেকে তৈরি করুন named তিনটি স্ট্রিং যুক্ত হয়েছে: ড্যাশবোর্ড_নিউ, ড্যাশবোর্ড_ড্রাফ্ট, ড্যাশবোর্ড_কম্পটেড)

func writeToCoachMarksPlist(status:String?,keyName:String?)
 {
  let path1 = NSBundle.mainBundle().pathForResource("CoachMarks", ofType: "plist")
  let coachMarksDICT = NSMutableDictionary(contentsOfFile: path1!)! as NSMutableDictionary
  var coachMarksMine = coachMarksDICT.objectForKey(keyName!)

  coachMarksMine  = status
  coachMarksDICT.setValue(status, forKey: keyName!)
  coachMarksDICT.writeToFile(path1!, atomically: true)
 }

পদ্ধতি হিসাবে বলা যেতে পারে

self.writeToCoachMarksPlist(" true - means user has checked the marks",keyName: "the key in the CoachMarks dictionary").

এটাই আমি খুঁজছিলাম! ধন্যবাদ, বন্ধু!
জয়প্রকাশ দুবে

6

নিকের উত্তরের মাধ্যমে একটি সুবিধার বর্ধনে রূপান্তরিত হয়েছে:

extension Dictionary {
    static func contentsOf(path: URL) -> Dictionary<String, AnyObject> {
        let data = try! Data(contentsOf: path)
        let plist = try! PropertyListSerialization.propertyList(from: data, options: .mutableContainers, format: nil)

        return plist as! [String: AnyObject]
    }
}

ব্যবহার:

let path = Bundle.main.path(forResource: "plistName", ofType: "plist")!
let url = URL(fileURLWithPath: path)
let dict = Dictionary<String, AnyObject>.contentsOf(path: url)

আমি বাজি রাখতে ইচ্ছুক যে এটি অ্যারেগুলির জন্যও একই রকম এক্সটেনশন তৈরি করতে কাজ করবে


5

এটি আসলে 1 লাইনে করতে পারে

    var dict = NSDictionary(contentsOfFile: NSBundle.mainBundle().pathForResource("Config", ofType: "plist"))

5

আপনি সুইফট ভাষায় plist এইভাবে পড়তে পারেন:

let path = NSBundle.mainBundle().pathForResource("PriceList", ofType: "plist")
let dict = NSDictionary(contentsOfFile: path)

একক অভিধান মান পড়ুন:

let test: AnyObject = dict.objectForKey("index1")

আপনি যদি প্লাস্টিতে সম্পূর্ণ বহুমাত্রিক অভিধান পেতে চান:

let value: AnyObject = dict.objectForKey("index2").objectForKey("date")

এখানে plist:

<plist version="1.0">
<dict>
<key>index2</key>
<dict>
    <key>date</key>
    <string>20140610</string>
    <key>amount</key>
    <string>110</string>
</dict>
<key>index1</key>
<dict>
    <key>amount</key>
    <string>125</string>
    <key>date</key>
    <string>20140212</string>
</dict>
</dict>
</plist>

4

যেহেতু এই উত্তরটি এখনও এখানে নেই, আপনি কেবলমাত্র এটি নির্দেশ করতে চেয়েছিলেন আপনি অভিধানটি হিসাবে তথ্য প্লাস্টিকটি পেতে তথ্য অভিধান অভিধানটিও ব্যবহার করতে পারেন Bundle.main.infoDictionary

যদিও আপনি যদি কেবল তথ্য প্লাস্টিতে কোনও নির্দিষ্ট আইটেমে আগ্রহী হন তবে এর মতো কিছু দ্রুত Bundle.main.object(forInfoDictionaryKey: kCFBundleNameKey as String) হতে পারে।

// Swift 4

// Getting info plist as a dictionary
let dictionary = Bundle.main.infoDictionary

// Getting the app display name from the info plist
Bundle.main.infoDictionary?[kCFBundleNameKey as String]

// Getting the app display name from the info plist (another way)
Bundle.main.object(forInfoDictionaryKey: kCFBundleNameKey as String)

3

আমার ক্ষেত্রে আমি একটি তৈরি NSDictionaryবলা appSettingsপ্রয়োজনীয় সমস্ত কী যোগ করুন। এই ক্ষেত্রে, সমাধানটি হ'ল:

if let dict = NSBundle.mainBundle().objectForInfoDictionaryKey("appSettings") {
  if let configAppToken = dict["myKeyInsideAppSettings"] as? String {

  }
}

ধন্যবাদ। objectForInfoDictionaryKeyঠিক আমি যা খুঁজছিলাম
লুনাকোডগার্ল

2

আপনি এটি ব্যবহার করতে পারেন, আমি গিথুব https://github.com/DaRkD0G/LoadExistance এ অভিধানের জন্য একটি সাধারণ এক্সটেনশন তৈরি করেছি

extension Dictionary {
    /**
        Load a Plist file from the app bundle into a new dictionary

        :param: File name
        :return: Dictionary<String, AnyObject>?
    */
    static func loadPlistFromProject(filename: String) -> Dictionary<String, AnyObject>? {

        if let path = NSBundle.mainBundle().pathForResource("GameParam", ofType: "plist") {
            return NSDictionary(contentsOfFile: path) as? Dictionary<String, AnyObject>
        }
        println("Could not find file: \(filename)")
        return nil
    }
}

এবং আপনি বোঝার জন্য এটি ব্যবহার করতে পারেন

/**
  Example function for load Files Plist

  :param: Name File Plist
*/
func loadPlist(filename: String) -> ExampleClass? {
    if let dictionary = Dictionary<String, AnyObject>.loadPlistFromProject(filename) {
        let stringValue = (dictionary["name"] as NSString)
        let intergerValue = (dictionary["score"] as NSString).integerValue
        let doubleValue = (dictionary["transition"] as NSString).doubleValue

        return ExampleClass(stringValue: stringValue, intergerValue: intergerValue, doubleValue: doubleValue)
    }
    return nil
}

2

এখানে @ সংখ্যার উত্তরের উপর ভিত্তি করে কিছুটা সংক্ষিপ্ত সংস্করণ দেওয়া হল

guard let path = Bundle.main.path(forResource: "GoogleService-Info", ofType: "plist"),
    let myDict = NSDictionary(contentsOfFile: path) else {
    return nil
}

let value = dict.value(forKey: "CLIENT_ID") as! String?

2

সুইফট 3.0

if let path = Bundle.main.path(forResource: "config", ofType: "plist") {
    let dict = NSDictionary(contentsOfFile: path)

    // use dictionary
}

আমার মতে এটি করার সবচেয়ে সহজ উপায়।


2

আমি একটি সরল Dictionaryইনিশিয়ালাইজার তৈরি করেছি যা প্রতিস্থাপন করে NSDictionary(contentsOfFile: path)। শুধু অপসারণ NS

extension Dictionary where Key == String, Value == Any {

    public init?(contentsOfFile path: String) {
        let url = URL(fileURLWithPath: path)

        self.init(contentsOfURL: url)
    }

    public init?(contentsOfURL url: URL) {
        guard let data = try? Data(contentsOf: url),
            let dictionary = (try? PropertyListSerialization.propertyList(from: data, options: [], format: nil) as? [String: Any]) ?? nil
            else { return nil }

        self = dictionary
    }

}

আপনি এটি এর মতো ব্যবহার করতে পারেন:

let filePath = Bundle.main.path(forResource: "Preferences", ofType: "plist")!
let preferences = Dictionary(contentsOfFile: filePath)!
UserDefaults.standard.register(defaults: preferences)

2

উপরের https://stackoverflow.com/users/3647770/ashok-r উত্তরের উপর ভিত্তি করে সুইফট iOS.০ আইওএস ১১.২. list তালিকাটি পার্স করা হয়েছে এবং কোডটিকে পার্স করতে হবে ।

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
  <dict>
    <key>identity</key>
    <string>blah-1</string>
    <key>major</key>
    <string>1</string>
    <key>minor</key>
    <string>1</string>
    <key>uuid</key>
    <string>f45321</string>
    <key>web</key>
    <string>http://web</string>
</dict>
<dict>
    <key>identity</key>
    <string></string>
    <key>major</key>
    <string></string>
    <key>minor</key>
    <string></string>
    <key>uuid</key>
    <string></string>
    <key>web</key>
    <string></string>
  </dict>
</array>
</plist>

do {
   let plistXML = try Data(contentsOf: url)
    var plistData: [[String: AnyObject]] = [[:]]
    var propertyListFormat =  PropertyListSerialization.PropertyListFormat.xml
        do {
            plistData = try PropertyListSerialization.propertyList(from: plistXML, options: .mutableContainersAndLeaves, format: &propertyListFormat) as! [[String:AnyObject]]

        } catch {
            print("Error reading plist: \(error), format: \(propertyListFormat)")
        }
    } catch {
        print("error no upload")
    }

1

পদক্ষেপ 1 : দ্রুত 3+ এ প্লিস্টকে পার্স করার সহজ এবং দ্রুততম উপায়

extension Bundle {

    func parsePlist(ofName name: String) -> [String: AnyObject]? {

        // check if plist data available
        guard let plistURL = Bundle.main.url(forResource: name, withExtension: "plist"),
            let data = try? Data(contentsOf: plistURL)
            else {
                return nil
        }

        // parse plist into [String: Anyobject]
        guard let plistDictionary = try? PropertyListSerialization.propertyList(from: data, options: [], format: nil) as? [String: AnyObject] else {
            return nil
        }

        return plistDictionary
    }
}

পদক্ষেপ 2: কীভাবে ব্যবহার করবেন:

Bundle().parsePlist(ofName: "Your-Plist-Name")

0

আমি যে সমাধানটি পেয়েছি তা এখানে:

let levelBlocks = NSDictionary(contentsOfFile: NSBundle.mainBundle().pathForResource("LevelBlocks", ofType: "plist"))
let test: AnyObject = levelBlocks.objectForKey("Level1")
println(test) // Prints the value of test

আমি ঘটতে পারে এমন একটি অপ্রত্যাশিত অনুমিতি সম্পর্কে একটি সতর্কতা নিঃশব্দ testকরার ধরণ সেট করে রেখেছি AnyObject

এছাড়াও এটি একটি শ্রেণিবদ্ধ পদ্ধতিতেও করতে হয়।

একটি পরিচিত ধরণের একটি নির্দিষ্ট মান অ্যাক্সেস এবং সংরক্ষণ করতে:

let value = levelBlocks.objectForKey("Level1").objectForKey("amount") as Int
println(toString(value)) // Converts value to String and prints it

0

আমি দ্রুত অভিধান ব্যবহার করি তবে এগুলিকে আমার ফাইল ম্যানেজার ক্লাসে এনএসডোলচারিতে এবং এ থেকে রূপান্তর করি:

    func writePlist(fileName:String, myDict:Dictionary<String, AnyObject>){
        let docsDir:String = dirPaths[0] as String
        let docPath = docsDir + "/" + fileName
        let thisDict = myDict as NSDictionary
        if(thisDict.writeToFile(docPath, atomically: true)){
            NSLog("success")
        } else {
            NSLog("failure")
        }

    }
    func getPlist(fileName:String)->Dictionary<String, AnyObject>{
        let docsDir:String = dirPaths[0] as String
        let docPath = docsDir + "/" + fileName
        let thisDict = NSDictionary(contentsOfFile: docPath)
        return thisDict! as! Dictionary<String, AnyObject>
    }

এটি পড়ার এবং লেখার সবচেয়ে কম ঝামেলার উপায় বলে মনে হচ্ছে তবে আমার কোডের বাকী অংশটি যত তাড়াতাড়ি তত দ্রুত থাকুক।


0

প্লিস্ট হ'ল সম্পত্তি তালিকার সাথে কাজ করার জন্য তৈরি করা একটি সাধারণ সুইফট এনাম।

// load an applications info.plist data

let info = Plist(NSBundle.mainBundle().infoDictionary)
let identifier = info["CFBundleIndentifier"].string!

আরও উদাহরণ:

import Plist

// initialize using an NSDictionary
// and retrieve keyed values

let info = Plist(dict)
let name = info["name"].string ?? ""
let age = info["age"].int ?? 0


// initialize using an NSArray
// and retrieve indexed values

let info = Plist(array)
let itemAtIndex0 = info[0].value


// utility initiaizer to load a plist file at specified path
let info = Plist(path: "path_to_plist_file")

// we support index chaining - you can get to a dictionary from an array via
// a dictionary and so on
// don't worry, the following will not fail with errors in case
// the index path is invalid
if let complicatedAccessOfSomeStringValueOfInterest = info["dictKey"][10]["anotherKey"].string {
  // do something
}
else {
  // data cannot be indexed
}

// you can also re-use parts of a plist data structure

let info = Plist(...)
let firstSection = info["Sections"][0]["SectionData"]
let sectionKey = firstSection["key"].string!
let sectionSecret = firstSection["secret"].int!

Plist.swift

Plist নিজেই বেশ সহজ, আপনি সরাসরি উল্লেখ করার ক্ষেত্রে এখানে এর তালিকা এখানে রয়েছে।

//
//  Plist.swift
//


import Foundation


public enum Plist {

    case dictionary(NSDictionary)
    case Array(NSArray)
    case Value(Any)
    case none

    public init(_ dict: NSDictionary) {
        self = .dictionary(dict)
    }

    public init(_ array: NSArray) {
        self = .Array(array)
    }

    public init(_ value: Any?) {
        self = Plist.wrap(value)
    }

}


// MARK:- initialize from a path

extension Plist {

    public init(path: String) {
        if let dict = NSDictionary(contentsOfFile: path) {
            self = .dictionary(dict)
        }
        else if let array = NSArray(contentsOfFile: path) {
            self = .Array(array)
        }
        else {
            self = .none
        }
    }

}


// MARK:- private helpers

extension Plist {

    /// wraps a given object to a Plist
    fileprivate static func wrap(_ object: Any?) -> Plist {

        if let dict = object as? NSDictionary {
            return .dictionary(dict)
        }
        if let array = object as? NSArray {
            return .Array(array)
        }
        if let value = object {
            return .Value(value)
        }
        return .none
    }

    /// tries to cast to an optional T
    fileprivate func cast<T>() -> T? {
        switch self {
        case let .Value(value):
            return value as? T
        default:
            return nil
        }
    }
}

// MARK:- subscripting

extension Plist {

    /// index a dictionary
    public subscript(key: String) -> Plist {
        switch self {

        case let .dictionary(dict):
            let v = dict.object(forKey: key)
            return Plist.wrap(v)

        default:
            return .none
        }
    }

    /// index an array
    public subscript(index: Int) -> Plist {
        switch self {
        case let .Array(array):
            if index >= 0 && index < array.count {
                return Plist.wrap(array[index])
            }
            return .none

        default:
            return .none
        }
    }

}


// MARK:- Value extraction

extension Plist {

    public var string: String?       { return cast() }
    public var int: Int?             { return cast() }
    public var double: Double?       { return cast() }
    public var float: Float?         { return cast() }
    public var date: Date?         { return cast() }
    public var data: Data?         { return cast() }
    public var number: NSNumber?     { return cast() }
    public var bool: Bool?           { return cast() }


    // unwraps and returns the underlying value
    public var value: Any? {
        switch self {
        case let .Value(value):
            return value
        case let .dictionary(dict):
            return dict
        case let .Array(array):
            return array
        case .none:
            return nil
        }
    }

    // returns the underlying array
    public var array: NSArray? {
        switch self {
        case let .Array(array):
            return array
        default:
            return nil
        }
    }

    // returns the underlying dictionary
    public var dict: NSDictionary? {
        switch self {
        case let .dictionary(dict):
            return dict
        default:
            return nil
        }
    }

}


// MARK:- CustomStringConvertible

extension Plist : CustomStringConvertible {
    public var description:String {
        switch self {
        case let .Array(array): return "(array \(array))"
        case let .dictionary(dict): return "(dict \(dict))"
        case let .Value(value): return "(value \(value))"
        case .none: return "(none)"
        }
    }
}

0

সুইফট 3.0

আপনি যদি .plist থেকে একটি "2-মাত্রিক অ্যারে" পড়তে চান তবে আপনি এটির মতো চেষ্টা করে দেখতে পারেন:

if let path = Bundle.main.path(forResource: "Info", ofType: "plist") {
    if let dimension1 = NSDictionary(contentsOfFile: path) {
        if let dimension2 = dimension1["key"] as? [String] {
            destination_array = dimension2
        }
    }
}

-2

প্লাস্ট ফাইলটি অ্যাক্সেস করার সহজ স্ট্রাক্ট (সুইফট ২.০)

struct Configuration {      
  static let path = NSBundle.mainBundle().pathForResource("Info", ofType: "plist")!
  static let dict = NSDictionary(contentsOfFile: path) as! [String: AnyObject]

  static let someValue = dict["someKey"] as! String
}

ব্যবহার:

print("someValue = \(Configuration.someValue)")
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.