每次在Xcode中新建一个iOS项目后,都会自己产生一个.plist文件,里面记录项目的一些配置信息。我们也可以自己创建.plist文件来进行数据的存储和读取。

 

.plist文件其实就是一个XML格式的文件,其支持的数据类型有(NS省略)Dictionary、Array、Boolean、Data、Date、Number、String这些类型。


当然对于用户自定义的对象,通过NSCoder转换后也是可以进行存储的。(常见我的另一篇文章“​​Swift - 本地数据的保存与加载(使用NSCoder将对象保存到.plist文件)​​”)




本文主要介绍如何使用.plist文件进行数组,字典,字符串等这些基本数据类型的存储和读取。


由于不需要转化,所以用起来还是很方便的。而且在大多数情况下,使用基本数据类型就足够了。




1,数组(Array)的存储和读取


(1)存储


下面把一个数组写入plist文件中(保存在用户文档目录),数组内是各个网站的地址。




1


2


3




​let​​ ​​array = ​​​​NSArray​​​​(objects: ​​​​"hangge.com"​​​​,​​​​"baidu.com"​​​​,​​​​"google.com"​​​​,​​​​"163.com"​​​​,​​​​"qq.com"​​​​)​


​let​​ ​​filePath:​​​​String​​ ​​= ​​​​NSHomeDirectory​​​​() + ​​​​"/Documents/webs.plist"​


​array.writeToFile(filePath, atomically: ​​​​true​​​​)​


进入目录打开webs.plist,可以看到生成的数据如下:


Swift - .plist文件数据的读取和存储_ide




1


2


3


4


5


6


7


8


9


10


11




​<?​​​​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​​​​>​


​<​​​​string​​​​>hangge.com</​​​​string​​​​>​


​<​​​​string​​​​>baidu.com</​​​​string​​​​>​


​<​​​​string​​​​>google.com</​​​​string​​​​>​


​<​​​​string​​​​>163.com</​​​​string​​​​>​


​<​​​​string​​​​>qq.com</​​​​string​​​​>​


​</​​​​array​​​​>​


​</​​​​plist​​​​>​



(2)读取


下面把webs.plist文件中数据读取出来显示在表格里


Swift - .plist文件数据的读取和存储_plist文件_02




1


2


3


4


5


6


7


8


9


10


11


12


13


14


15


16


17


18


19


20


21


22


23


24


25


26


27


28


29


30


31


32


33


34


35


36




​import​​ ​​UIKit​


 


​class​​ ​​ViewController​​​​: ​​​​UIViewController​​ ​​, ​​​​UITableViewDelegate​​​​, ​​​​UITableViewDataSource​​​​{​


 


 


​@IBOutlet​​ ​​weak​​ ​​var​​ ​​tableView: ​​​​UITableView​​​​!​


 


​var​​ ​​webs:​​​​NSArray​​​​?​


 


​override​​ ​​func​​ ​​viewDidLoad() {​


​super​​​​.viewDidLoad()​


 


​webs = ​​​​NSArray​​​​(contentsOfFile: ​​​​NSHomeDirectory​​​​() + ​​​​"/Documents/webs.plist"​​​​)​


​self​​​​.tableView!.delegate = ​​​​self​


​self​​​​.tableView!.dataSource = ​​​​self​


​//创建一个重用的单元格​


​self​​​​.tableView!.registerClass(​​​​UITableViewCell​​​​.​​​​self​​​​, forCellReuseIdentifier: ​​​​"cell0"​​​​)​


​}​


 


​func​​ ​​tableView(tableView: ​​​​UITableView​​​​, numberOfRowsInSection section: ​​​​Int​​​​) -> ​​​​Int​​ ​​{​


​return​​ ​​webs!.count​


​}​


 


​func​​ ​​tableView(tableView: ​​​​UITableView​​​​, cellForRowAtIndexPath indexPath: ​​​​NSIndexPath​​​​)​


​-> ​​​​UITableViewCell​​ ​​{​


​let​​ ​​cell = tableView.dequeueReusableCellWithIdentifier(​​​​"cell0"​​​​,​


​forIndexPath: indexPath) ​​​​as​​ ​​UITableViewCell​


​let​​ ​​url = webs![indexPath.row] ​​​​as​​​​! ​​​​String​


​cell.textLabel?.text = url​


​return​​ ​​cell​


​}​


 


​override​​ ​​func​​ ​​didReceiveMemoryWarning() {​


​super​​​​.didReceiveMemoryWarning()​


​}​


​}​





2,字典(Dictionary)的存储和读取 


下面给每条网址都附上网站名,这时我们就要使用字典了。


(1)存储


除了每条网站记录使用字典类型,外面还拆分成两个数组分别存储,用于下面表格的分区展示。




1


2


3


4


5


6


7


8


9


10


11


12


13


14


15




​let​​ ​​myArray = [​


​[​


​[​​​​"name"​​​​:​​​​"航歌"​​​​, ​​​​"url"​​​​:​​​​"hangge.com"​​​​],​


​[​​​​"name"​​​​:​​​​"百度"​​​​, ​​​​"url"​​​​:​​​​"baidu.com"​​​​],​


​[​​​​"name"​​​​:​​​​"google"​​​​, ​​​​"url"​​​​:​​​​"google.com"​​​​]​


​],​


​[​


​[​​​​"name"​​​​:​​​​"163"​​​​, ​​​​"url"​​​​:​​​​"163.com"​​​​],​


​[​​​​"name"​​​​:​​​​"QQ"​​​​, ​​​​"url"​​​​:​​​​"qq.com"​​​​]​


​]​


​]  ​​​​//声明一个字典​


 


​let​​ ​​filePath:​​​​String​​ ​​= ​​​​NSHomeDirectory​​​​() + ​​​​"/Documents/webs.plist"​


​NSArray​​​​(array: myArray).writeToFile(filePath, atomically: ​​​​true​​​​)​


​print​​​​(filePath)​


进入目录打开webs.plist,可以看到生成的数据如下:


Swift - .plist文件数据的读取和存储_数据_03




1


2


3


4


5


6


7


8


9


10


11


12


13


14


15


16


17


18


19


20


21


22


23


24


25


26


27


28


29


30


31


32


33


34


35


36


37


38


39


40




​<?​​​​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​​​​>​


​<​​​​array​​​​>​


​<​​​​dict​​​​>​


​<​​​​key​​​​>name</​​​​key​​​​>​


​<​​​​string​​​​>航歌</​​​​string​​​​>​


​<​​​​key​​​​>url</​​​​key​​​​>​


​<​​​​string​​​​>hangge.com</​​​​string​​​​>​


​</​​​​dict​​​​>​


​<​​​​dict​​​​>​


​<​​​​key​​​​>name</​​​​key​​​​>​


​<​​​​string​​​​>百度</​​​​string​​​​>​


​<​​​​key​​​​>url</​​​​key​​​​>​


​<​​​​string​​​​>baidu.com</​​​​string​​​​>​


​</​​​​dict​​​​>​


​<​​​​dict​​​​>​


​<​​​​key​​​​>name</​​​​key​​​​>​


​<​​​​string​​​​>google</​​​​string​​​​>​


​<​​​​key​​​​>url</​​​​key​​​​>​


​<​​​​string​​​​>google.com</​​​​string​​​​>​


​</​​​​dict​​​​>​


​</​​​​array​​​​>​


​<​​​​array​​​​>​


​<​​​​dict​​​​>​


​<​​​​key​​​​>name</​​​​key​​​​>​


​<​​​​string​​​​>163</​​​​string​​​​>​


​<​​​​key​​​​>url</​​​​key​​​​>​


​<​​​​string​​​​>163.com</​​​​string​​​​>​


​</​​​​dict​​​​>​


​<​​​​dict​​​​>​


​<​​​​key​​​​>name</​​​​key​​​​>​


​<​​​​string​​​​>QQ</​​​​string​​​​>​


​<​​​​key​​​​>url</​​​​key​​​​>​


​<​​​​string​​​​>qq.com</​​​​string​​​​>​


​</​​​​dict​​​​>​


​</​​​​array​​​​>​


​</​​​​array​​​​>​


​</​​​​plist​​​​>​



(2)读取

下面把webs.plist文件中数据读取出来,并在表格里分区显示


Swift - .plist文件数据的读取和存储_xml_04




1


2


3


4


5


6


7


8


9


10


11


12


13


14


15


16


17


18


19


20


21


22


23


24


25


26


27


28


29


30


31


32


33


34


35


36


37


38


39


40


41


42


43


44


45


46


47


48


49


50


51


52


53


54




​import​​ ​​UIKit​


 


​class​​ ​​ViewController​​​​: ​​​​UIViewController​​ ​​, ​​​​UITableViewDelegate​​​​, ​​​​UITableViewDataSource​​​​{​


 


​@IBOutlet​​ ​​weak​​ ​​var​​ ​​tableView: ​​​​UITableView​​​​!​


 


​var​​ ​​webs:​​​​NSArray​​​​?​


 


​override​​ ​​func​​ ​​viewDidLoad() {​


​super​​​​.viewDidLoad()​


 


​webs = ​​​​NSArray​​​​(contentsOfFile: ​​​​NSHomeDirectory​​​​() + ​​​​"/Documents/webs.plist"​​​​)​


​self​​​​.tableView!.delegate = ​​​​self​


​self​​​​.tableView!.dataSource = ​​​​self​


​//创建一个重用的单元格​


​self​​​​.tableView!.registerClass(​​​​UITableViewCell​​​​.​​​​self​​​​, forCellReuseIdentifier: ​​​​"cell0"​​​​)​


 


​}​


 


​// UITableViewDataSource协议中的方法,该方法的返回值决定指定分区的头部​


​func​​ ​​tableView(tableView:​​​​UITableView​​​​, titleForHeaderInSection​


​section:​​​​Int​​​​)->​​​​String​​​​?​


​{​


​return​​ ​​" "​​​​;​


​}​


 


​//在本例中,有2个分区​


​func​​ ​​numberOfSectionsInTableView(tableView: ​​​​UITableView​​​​) -> ​​​​Int​​ ​​{​


​return​​ ​​webs!.count;​


​}​


 


​//每个分区的记录数​


​func​​ ​​tableView(tableView: ​​​​UITableView​​​​, numberOfRowsInSection section: ​​​​Int​​​​) -> ​​​​Int​​ ​​{​


​let​​ ​​data = ​​​​self​​​​.webs?[section]​


​return​​ ​​data!.count​


​}​


 


​//每个单元格创建和内容赋值​


​func​​ ​​tableView(tableView: ​​​​UITableView​​​​, cellForRowAtIndexPath indexPath: ​​​​NSIndexPath​​​​)​


​-> ​​​​UITableViewCell​​ ​​{​


​let​​ ​​cell = ​​​​UITableViewCell​​​​(style: ​​​​UITableViewCellStyle​​​​.​​​​Value1​​​​,​


​reuseIdentifier: ​​​​"cell0"​​​​)​


​let​​ ​​data = ​​​​self​​​​.webs?[indexPath.section]​


​let​​ ​​url = data![indexPath.row][​​​​"url"​​​​] ​​​​as​​​​! ​​​​String​


​let​​ ​​name = data![indexPath.row][​​​​"name"​​​​] ​​​​as​​​​! ​​​​String​


​cell.textLabel?.text = name​


​cell.detailTextLabel?.text = url​


​return​​ ​​cell​


​}​


 


​override​​ ​​func​​ ​​didReceiveMemoryWarning() {​


​super​​​​.didReceiveMemoryWarning()​


​}​


​}​