如何在swift中从struct中检索值

时间:2017-05-03 11:39:07

标签: ios swift struct swift3

我将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没有下标成员"

如何正确访问名称值?

4 个答案:

答案 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 }