ios - Xcode Swift 如何从我的自定义 plist 文件中打印一个值?
问题描述
好的,我已经阅读了很多关于 NSArray NSDictionary 的内容,我现在迷路了,我想要的是从我的自定义 plist 的第一个数组项中打印值“名称”。
这是我的清单:
这是我在 ViewController.swift 中的代码:
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
let path = Bundle.main.path(forResource: "test", ofType: "plist")
let dic = NSArray(contentsOfFile: path!)
print(dic?.firstObject)
}
}
在我的控制台中,我看到:
Optional({
active = 0;
name = "John Doe";
})
我认为这print(dic?.firstObject["name"])
可以解决问题,但我得到一个错误:“任何?”类型的值 没有下标
那么如何打印我的第一个数组的name和active值?
我知道关于这个问题有很多答案,这就是我到目前为止的原因。但我只是不知道如何解决这个问题。
亲切的问候,
拉尔夫
解决方案
首先请不要使用NSArray/NSDictionary
Swift 中的相关 API 来读取属性列表。您正在丢弃类型信息。
但是,您可以使用
let array = NSArray(contentsOfFile: path!) as! [[String:Any]]
for item in array {
let name = item["name"] as! String
let active = item["active"] as! Bool
print(name, active)
}
专用和推荐的 API 是PropertyListSerialization
:
let url = Bundle.main.url(forResource: "test", withExtension: "plist")!
let data = try! Data(contentsOf: url)
let array = try! PropertyListSerialization.propertyList(from: data, format: nil) as! [[String:Any]]
更好的方法是Codable
协议和PropertyListDecoder
struct User : Decodable {
let name : String
let active : Bool
}
override func viewDidLoad() {
super.viewDidLoad()
let url = Bundle.main.url(forResource: "test", withExtension: "plist")!
let data = try! Data(contentsOf: url)
let array = try! PropertyListDecoder().decode([User].self, from: data)
for item in array {
print(item.name, item.active)
}
}
代码不得崩溃。如果是这样,你就犯了设计错误
推荐阅读
- regex - 正则表达式匹配重复模式
- flutter - 鼠标按下时 MouseRegion 被禁用
- python - 如何使用继承的类方法和维护子类
- r - 如何将 £ 添加到 valueBox 输出
- terminal - 如何在终端中仅打印出 eslint 错误的数量?
- python-3.x - 使用 Python 和 OpenCV 读取七段显示器
- r - Dplyr cross + mutate + condition 选择列
- r - 在 ggplot2 中对数据集使用 'data()' '$result'
- android - Android MapView 导致表面更新
- swift - 使用 Alamofire Swift 将图像上传到服务器