Xcode Swift, как мне распечатать значение из моего настраиваемого файла plist? - PullRequest
0 голосов
/ 14 июля 2020

Хорошо, я так много читал о NSArray NSDictionary. Я потерялся, я хочу вывести значение name из первого элемента массива моего настраиваемого списка.

Это мой список:

введите описание изображения здесь

и это мой код в моем 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"]) сработает, но я получаю сообщение об ошибке: Значение типа «Any?» не имеет индексов

Итак, как мне напечатать значения name и active моего первого массива?

Я знаю, что есть много ответов на ТАК по этому вопросу, вот почему я так далеко. но я просто не знаю, как это исправить.

С уважением,

Ральф

Ответы [ 2 ]

2 голосов
/ 14 июля 2020

Прежде всего, пожалуйста, никогда не используйте API, связанный с NSArray/NSDictionary в Swift, для чтения списка свойств. Вы выбрасываете информацию о типе.

Однако вы можете прочитать значения с помощью

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]]

A Лучше использовать протокол 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)
    } 
}

Код не должен взламывать sh. Если это так, вы допустили ошибку в дизайне

0 голосов
/ 14 июля 2020

Чтобы использовать индексы, вам сначала нужно преобразовать объект, возвращаемый

dic?firstObject

, в словарь, вы также можете развернуть необязательный на этом этапе.

if let item = dic?firstObject as? [String: Any] {
   print(item["name")
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...