如何解决为什么无法在 Swift 项目中访问我的模型类?
如何从 ViewController 访问我的模型并使用模型数据加载到表视图中????
源代码Link
我的 ViewController 看起来像这样
import UIKit
class ViewController: UIViewController {
var cclm: CountryCodeListModel?
override func viewDidLoad() {
super.viewDidLoad()
Timer.scheduledTimer(timeInterval: 3,target: self,selector: #selector(hello),userInfo: nil,repeats: true)
readLocalJSONFile(forName: "countryList")
// Do any additional setup after loading the view.
}
override func viewDidAppear(_ animated: Bool) {
}
@objc func hello()
{
print(cclm?.data?[0].flag)
}
}
我的模型类看起来像这样
struct CountryCodeList : Decodable {
var alpha2Code: String?
var alpha3Code: String?
var flag : String?
var name : String?
var code : String?
}
public struct CountryCodeListModel : Decodable {
var data : [CountryCodeList]?
}
var cclm: CountryCodeListModel?
//Method to load json
func readLocalJSONFile(forName name: String) {
do {
if let filePath = Bundle.main.path(forResource: name,ofType: "json") {
let fileUrl = URL(fileURLWithPath: filePath)
let data = try Data(contentsOf: fileUrl)
if let countryCodeObject = parse(jsonData: data) {
cclm = countryCodeObject
print(cclm?.data?[1].alpha2Code ?? "") //Printing Correct Value
}
}
} catch {
print("error: \(error)")
}
}
func parse(jsonData: Data) -> CountryCodeListModel?{
var dataArray : [Dictionary<String,Any>] = [[:]]
var country = Dictionary<String,Any>()
var modelData = Dictionary<String,Any>()
do {
// make sure this JSON is in the format we expect
if let json = try JSONSerialization.jsonObject(with: jsonData,options: []) as? Dictionary<String,Any> {
dataArray.removeAll()
for item in json["data"] as! [Dictionary<String,Any>] {
country = item
let url = URL(string: country["flag"] as? String ?? "")
let data = try? Data(contentsOf: url!) //make sure your image in this url does exist,otherwise unwrap in a if let check / try-catch
let image = UIImage(data: data!)
let documentsDirectory = FileManager.default.urls(for: .documentDirectory,in: .userDomainMask).first!
let fileName = url?.lastPathComponent // name of the image to be saved
let fileURL = documentsDirectory.appendingPathComponent(fileName ?? "")
if let data = image?.jpegData(compressionQuality: 1.0){
do {
try data.write(to: fileURL)
country["flag"] = fileURL.absoluteString
//print("file saved")
//urlAsString = fileURL.absoluteString
} catch {
print("error saving file:",error)
}
}
dataArray.append(country)
country.removeAll()
}
modelData["data"] = dataArray
//print(modelData)
let jsonData1 = try JSONSerialization.data(withJSONObject: modelData,options: [])
do {
let decodedData = try JSONDecoder().decode(CountryCodeListModel.self,from: jsonData1)
return decodedData
} catch {
print("error: \(error)")
}
}
} catch let error as NSError {
print("Failed to load: \(error.localizedDescription)")
}
return nil
}
问题说明:
我正在读取本地json并获取标志键的url值并将相应的图像下载到本地。下载后,我将使用本地路径并在字典中更新,然后创建 JSON 对象并更新我的模型类。
现在,我正在尝试从 ViewController 访问我的模型类,如下所示
print(CountryCodeListModel?.data?[0].name) //check screenshot for error
print(cclm?.data?[0].flag) // this prints nil always
请检查附加的错误屏幕截图2
我的 JSON 看起来像这样
{
"meta":{
"success":true,"message":"Successfully retrieved country details","code":"200"
},"data":[
{
"alpha2Code":"AF","alpha3Code":"AFG","flag":"https://raw.githubusercontent.com/DevTides/countries/master/afg.png","name":"Afghanistan","code":"+93"
},{
"alpha2Code":"AX","alpha3Code":"ALA","flag":"https://raw.githubusercontent.com/DevTides/countries/master/ala.png","name":"Aland Islands","code":"+358"
},{
"alpha2Code":"AL","alpha3Code":"ALB","flag":"https://raw.githubusercontent.com/DevTides/countries/master/alb.png","name":"Albania","code":"+355"
},{
"alpha2Code":"DZ","alpha3Code":"DZA","flag":"https://raw.githubusercontent.com/DevTides/countries/master/dza.png","name":"Algeria","code":"+213"
},{
"alpha2Code":"AS","alpha3Code":"ASM","flag":"https://raw.githubusercontent.com/DevTides/countries/master/asm.png","name":"American Samoa","code":"+1684"
}
]
}
解决方法
您正在尝试解码不存在的东西。
print(CountryCodeListModel?.data?[0].name) //check screenshot for error
print(cclm?.data?[0].flag) // this prints nil always
上面的代码说明你想要:
- 名字
- 位置 0 处的变量数据
- 结构体
CountryCodeListModel
。
你想做的是:
- 名字
- 位置 0 处的变量
- 结构体
CountryCodeListModel
的实例。
例如...
func readLocalJSONFile(forName name: String) {
do {
if let filePath = Bundle.main.path(forResource: name,ofType: "json") {
let fileUrl = URL(fileURLWithPath: filePath)
let data = try Data(contentsOf: fileUrl)
if let countryCodeObject = parse(jsonData: data) {
cclm = countryCodeObject
print(cclm?.data?[1].alpha2Code ?? "") //Printing Correct Value
print(cclm?.data?[0].flag ?? "")
print(countryCodeObject?.data[0].flag ?? "") // Same as the line above
}
}
} catch {
print("error: \(error)")
}
}
除非您尝试使用 static
变量(您将在该变量处使用 CountryCodeListModel.data
),否则您需要确保您实际使用的是结构的实例或类的对象引用您的属性。
注意
CountryCodeListModel
是一个结构体。 CountryCodeListModel()
是结构 CountryCodeListModel
的一个实例。由于您可以拥有一个结构的多个实例,因此在访问数据时需要引用特定的结构。因此,CountryCodeListModel.data
将不起作用,它必须是 CountryCodeListModel().data
。在这种情况下,您有 cclm.data
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。