Saya bermain-main dengan bahasa pemrograman Swift baru Apple dan memiliki beberapa masalah ...
Saat ini saya mencoba membaca file plist, di Objective-C saya akan melakukan yang berikut untuk mendapatkan konten sebagai NSDictionary:
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Config" ofType:@"plist"];
NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:filePath];
Bagaimana cara mendapatkan plist sebagai Kamus di Swift?
Saya berasumsi saya bisa mendapatkan path ke plist dengan:
let path = NSBundle.mainBundle().pathForResource("Config", ofType: "plist")
Kapan ini berfungsi (Jika itu benar?): Bagaimana saya mendapatkan konten sebagai Kamus?
Juga pertanyaan yang lebih umum:
Apakah boleh menggunakan kelas NS * default ? Saya kira begitu ... atau saya melewatkan sesuatu? Sejauh yang saya tahu kerangka kerja standar NS * kelas masih valid dan boleh digunakan?
Jawaban:
Dalam 3,0 Membaca cepat dari Plist.
Baca Selengkapnya CARA MENGGUNAKAN DAFTAR PROPERTI (. DAFTAR) DI SWIFT .
sumber
Anda masih dapat menggunakan NSDictionaries di Swift:
Untuk Swift 4
Untuk Swift 3+
Dan versi Swift yang lebih lama
NSClasses masih tersedia dan sangat baik untuk digunakan di Swift. Saya pikir mereka mungkin ingin segera beralih fokus ke swift, tetapi saat ini API cepat tidak memiliki semua fungsionalitas NSClasses inti.
sumber
mainBundle()
hanya adamain
di Swift 3NSArray/NSDictionary
sama sekali untuk membaca data daftar properti.PropertyListSerialization
(dan dalam Swift 4 sebagai alternatifCodable
protokol) adalah API yang sesuai. Ini memberikan penanganan kesalahan modern dan data dapat dikonversi langsung ke tipe pengumpulan Swift asli.Ini yang saya lakukan jika saya ingin mengonversi .plist ke kamus Swift:
Diedit untuk Swift 2.0:
Diedit untuk Swift 3.0:
sumber
NSArray/NSDictionary
sama sekali untuk membaca data daftar properti.PropertyListSerialization
(dan dalam Swift 4 sebagai alternatifCodable
protokol) adalah API yang sesuai. Ini memberikan penanganan kesalahan modern dan data dapat dikonversi langsung ke tipe pengumpulan Swift asli.Cepat 4.0
Anda sekarang dapat menggunakan protokol Decodable untuk Decode a .plist ke kustom struct. Saya akan membahas contoh dasar, untuk struktur .plist yang lebih rumit Saya sarankan membaca di Decodable / Encodable (sumber yang bagus ada di sini: https://benscheirman.com/2017/06/swift-json/ ).
Pertama, atur struct Anda ke dalam format file .plist Anda. Untuk contoh ini saya akan mempertimbangkan. Daftar dengan Kamus tingkat akar dan 3 entri: 1 String dengan kunci "nama", 1 Int dengan kunci "usia", dan 1 Boolean dengan kunci "tunggal". Berikut adalah struct:
Cukup sederhana. Sekarang bagian yang keren. Menggunakan kelas PropertyListDecoder kita dapat dengan mudah mem-parsing file .plist ke instantiation dari struct ini:
Tidak banyak lagi kode yang perlu dikhawatirkan, dan semuanya ada di Swift. Lebih baik lagi sekarang kita memiliki instantiation dari struct Config yang dapat kita gunakan dengan mudah:
Ini Mencetak nilai untuk kunci "nama", "usia", dan "tunggal" di .plist.
sumber
Bundle.main.url(forResource: "Config", withExtension: "plist")
dan singkirkanURL(fileURLWithPath
? Dan karena file harus ada (pada desain / waktu kompilasi) semua nilai dapat dibuka paksa. Kode tidak boleh macet jika semuanya dirancang dengan benar.url(forResource: "Config", withExtension: "plist")
saya hanya mencocokkan apa yang OP lakukan dalam kode mereka sebagai titik perbandingan. Sejauh memaksa membuka semuanya, saya mencoba berbuat salah di sisi kehati-hatian. Saya pikir itu adalah pertanyaan mendasar bagi Swift secara umum. Saya lebih suka tahu persis apa yang kode saya akan lakukan dalam situasi apa pun selain crash.decoder.decode([Config].self, from: data)
. (Perhatikan tanda kurung di sekitar [Konfigurasi])Jawaban ini menggunakan objek asli Swift daripada NSDictionary.
Swift 3.0
sumber
Saya telah bekerja dengan Swift 3.0 dan ingin menyumbangkan jawaban untuk sintaks yang diperbarui. Selain itu, dan mungkin yang lebih penting, saya menggunakan PropertyListSerialization objek untuk melakukan angkat berat, yang jauh lebih fleksibel daripada hanya menggunakan NSDictionary karena memungkinkan untuk Array sebagai jenis akar dari plist.
Di bawah ini adalah screenshot dari plist yang saya gunakan. Ini adalah sedikit rumit, sehingga untuk menunjukkan kekuatan yang tersedia, tetapi ini akan bekerja untuk setiap kombinasi yang diijinkan jenis plist.
Seperti yang Anda lihat, saya menggunakan Array String: kamus string untuk menyimpan daftar nama situs web dan URL yang sesuai.
Saya menggunakan objek PropertyListSerialization , seperti yang disebutkan di atas, untuk melakukan angkat berat bagi saya. Selain itu, Swift 3.0 telah menjadi lebih "Swifty" sehingga semua nama objek telah kehilangan awalan "NS".
Setelah kode di atas berjalan
plist
akan menjadi tipeArray<AnyObject>
, tetapi kita tahu tipe apa itu sebenarnya sehingga kita dapat melemparkannya ke tipe yang benar:Dan sekarang kita dapat mengakses berbagai properti Array String kami: Kamus String dengan cara alami. Mudah-mudahan untuk mengubahnya menjadi struct atau kelas yang sangat diketik nyata;)
sumber
Cara terbaik adalah menggunakan kamus dan array asli karena kamus tersebut telah dioptimalkan untuk digunakan dengan cepat. Yang sedang berkata Anda dapat menggunakan NS ... kelas di cepat dan saya pikir situasi ini menjamin itu. Inilah cara Anda mengimplementasikannya:
Sejauh ini (menurut saya) ini adalah cara termudah dan paling efisien untuk mengakses sebuah plist, tetapi di masa depan saya berharap apel akan menambah lebih banyak fungsi (seperti menggunakan plist) ke dalam kamus asli.
sumber
Swift - Baca / Tulis plist dan file teks ....
sumber
Swift 2.0: Mengakses Info.Plist
Saya memiliki Kamus bernama CoachMarksDictionary dengan nilai boolean di Info.Plist. Saya ingin mengakses nilai bool dan mewujudkannya.
Menulis Kepada Plist:
Dari Custom Plist: - (Buat dari File-New-File-Resource-PropertyList. Menambahkan tiga string bernama: DashBoard_New, DashBoard_Draft, DashBoard_Completed)
Metode ini dapat disebut sebagai
sumber
Dikonversi menjadi ekstensi kenyamanan melalui jawaban Nick:
pemakaian:
Saya berani bertaruh bahwa itu juga akan berhasil untuk membuat ekstensi serupa untuk Array
sumber
sebenarnya bisa melakukannya dalam 1 baris
sumber
Anda dapat membaca plist dalam Bahasa SWIFT dengan cara ini:
Baca nilai Kamus Tunggal:
Jika Anda ingin mendapatkan kamus multi-dimensi penuh dalam daftar:
Berikut adalah daftar:
sumber
Karena jawaban ini belum ada di sini, hanya ingin menunjukkan Anda juga dapat menggunakan properti infoDictionary untuk mendapatkan info daftar sebagai kamus
Bundle.main.infoDictionary
,.Meskipun sesuatu seperti
Bundle.main.object(forInfoDictionaryKey: kCFBundleNameKey as String)
mungkin lebih cepat jika Anda hanya tertarik pada item tertentu dalam daftar info.sumber
dalam kasus saya saya membuat
NSDictionary
disebutappSettings
dan menambahkan semua kunci yang diperlukan. Untuk kasus ini, solusinya adalah:sumber
objectForInfoDictionaryKey
persis apa yang saya cari.Anda dapat menggunakannya, saya membuat ekstensi sederhana untuk Kamus di github https://github.com/DaRkD0G/LoadExtension
Dan Anda dapat menggunakannya untuk memuat
sumber
Ini adalah versi yang sedikit lebih pendek, berdasarkan jawaban @connor
sumber
Swift 3.0
Cara termudah untuk melakukan ini menurut saya.
sumber
Saya telah membuat
Dictionary
penginisialisasi sederhana yang menggantikanNSDictionary(contentsOfFile: path)
. Hapus sajaNS
.Anda dapat menggunakannya seperti ini:
sumber
Swift 4.0 iOS 11.2.6 daftar diuraikan dan kode untuk menguraikannya, berdasarkan https://stackoverflow.com/users/3647770/ashok-r jawaban di atas.
sumber
Langkah 1 : Cara sederhana dan tercepat untuk mengurai plist di swift 3+
Langkah 2: Cara menggunakan:
sumber
Inilah solusi yang saya temukan:
Saya mengatur jenis
test
keAnyObject
membungkam peringatan tentang kesimpulan yang tak terduga yang bisa terjadi.Juga, itu harus dilakukan dalam metode kelas.
Untuk mengakses dan menyimpan nilai spesifik dari tipe yang dikenal:
sumber
Saya menggunakan kamus cepat tetapi mengonversinya ke dan dari NSDictionaries di kelas manajer file saya seperti:
Ini sepertinya cara yang paling tidak bermasalah untuk membaca dan menulis tetapi mari sisa kode saya tetap secepat mungkin.
sumber
Plist adalah enum Swift sederhana yang saya buat untuk bekerja dengan daftar properti.
Lebih banyak contoh:
Plist.swift
Plist itu sendiri cukup sederhana, ini daftarnya jika Anda merujuk langsung.
sumber
Swift 3.0
jika Anda ingin membaca "Array 2-dimensi" dari .plist, Anda dapat mencobanya seperti ini:
sumber
Struct sederhana untuk mengakses file plist (Swift 2.0)
Pemakaian:
sumber