我将JSON数据转换为结构,然后将结构添加到数组中,但是当我这样做时,我无法访问结构中的值。
首先,我得到了我的结构:
struct Skill {
var name: String
init(dictionary: [String: Any]){
name = dictionary["name"] as! String
}
}
然后在另一个类中,我将我的JSON数据转换为结构并将其添加到数组中。我可以访问for循环中的值(即skillDict.name),但我无法从另一个类的数组中访问它们。
var skillArray: NSMutableArray = []
fun getJSON(){
….
if let skill : NSArray = jsonRoot["skills"] as? NSArray
{
for each in skill{
var skillDict = Skill(dictionary: each as! [String : Any])
skillArray.add(skillDict)
}
}
当我从另一个类运行以下代码时,我在第一个打印行上出现此错误:"此类不是键值编码兼容的键名称"。我也试过使用第二个打印行正确打印了所有对象,但我无法访问名称值。
for each in skillArray{
print(skillArray.value(forKey: "name"))
print(each) //this line will print correctly, so I know the correct data is in the array
}
我也试过在for循环的内部和外部使用以下代码:
print(skillArray.map { $0["name"] as? String })
但是我收到编译错误" Type Any没有下标成员"
如何正确访问名称值?
答案 0 :(得分:2)
如果你想使用下标键isEqual to" name"然后返回名称
struct Skill {
var name: String
init(dictionary: [String: Any]){
name = dictionary["name"] as! String
}
subscript(_ name: String) -> String? {
get {
return name == "name" ? self.name : nil
}
}
}
此代码可以使用print(skillArray.map { $0["name"] as? String })
工作
答案 1 :(得分:0)
您有两种方法可以解决此问题:将skillArray
类型[Skill]
代替NSMutablearray
或将地图函数中的$0
转换为{{1}类型首先,然后使用底层属性。
Skill
答案 2 :(得分:0)
如果您将cursor
声明为:
skillArray
那么这应该有效:
var skillArray = Array<Skill>()
答案 3 :(得分:0)
将数组实例化为[Skill]:
var skillArray = [Skill]()
...
let names = skillArray.map { $0.name }