Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/103.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在swift中从结构中检索值_Ios_Swift_Struct_Swift3 - Fatal编程技术网

Ios 如何在swift中从结构中检索值

Ios 如何在swift中从结构中检索值,ios,swift,struct,swift3,Ios,Swift,Struct,Swift3,我将JSON数据转换为一个结构,然后将该结构添加到一个数组中,但是当我这样做时,在访问结构中的值时遇到了问题 首先,我得到了我的结构: struct Skill { var name: String init(dictionary: [String: Any]){ name = dictionary["name"] as! String } } 然后在另一个类中,我将JSON数据转换为结构并将其添加到数组中。我可以访问for循环(即skillDict.

我将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 })
但是我得到一个编译器错误“类型Any没有下标成员”


如何正确访问名称值?

有两种方法可以修复它:首先将
[Skill]
类型的
skillArray
替换为
NSMutablearray
,或者在map函数中将
$0
转换为
Skill
类型,然后使用基础属性

e、 例如,这可能会有帮助:

print(skillArray.map { ($0 as! Skill).name })

如果您将
skillArray
声明为:

var skillArray = Array<Skill>()

如果要使用下标键isEqual来表示“name”,则返回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})
work

将数组实例化为
[Skill]

var skills = [Skill]()
...
let names = skills.map { $0.name }

…如果您使用
flatMap{($0 as?Skill).name}
,它将跳过强制转换失败的元素,而不是崩溃
var skills = [Skill]()
...
let names = skills.map { $0.name }