繁体   English   中英

在Swift中从AnyObject创建数组

[英]Creating array from AnyObject in Swift

我有一个像这样的AnyObject类型的数组:[[String:AnyObject]]

animalList = [[“名称”:ABC,“颜色”:红色],[“名称”:DEF,“颜色”:绿色],[“名称”:GHI,“颜色”:蓝色]]

该模型类是这样的:

class ModelAnimal {

    var name: String
    var color: String

    init(name: String, color: String){
        self.name = name
        self.color = color 
    }
}

如何将它们放入ModelAnimal类型的数组中:

var myList = Array<ModelAnimal>()

    for var i = 0; i < animalList.count; i++ {

     myList.

    }

使用map创建一个[ModelAnimal]类型的新数组:

let animalList: [[String: AnyObject]] = [["name": "ABC", "color":"red"], ["name": "DEF", "color": "green"], ["name": "GHI", "color": "blue"]]

class ModelAnimal {

    var name: String
    var color: String

    init(name: String, color: String){
        self.name = name
        self.color = color
    }
}

let myList = animalList.map { ModelAnimal(name: $0["name"] as? String ?? "", color: $0["color"] as? String ?? "") }

这还利用条件转换 as? String as? String以及nil合并运算符 ?? 以安全地从字典数组中提取值,并将其传递给ModelAnimal的构造ModelAnimal

1.结构

首先建议,使用Struct而不是Class模型。

为什么要构造?

  1. 一个结构确实允许您定义failable init ,可以返回失败,但不会初始化所有存储的性能。
  2. Struct保存到设备的堆栈内存中的速度比堆快得多。
  3. 最后,如果namecolor字段不变,则应将它们声明为let 这样,您的Struct将会完全不可变(这有几个方面的好处)。

2.初始化失败

向您的模型添加一个failable inititializer以接收可选参数

struct ModelAnimal {

    let name: String // you can change this back to var if needed
    let color: String  // you can change this back to var if needed

    init(name: String, color: String){
        self.name = name
        self.color = color
    }

    init?(name: String?, color: String?) {
        guard let name = name, color = color else { return nil }
        self.name = name
        self.color = color
    }
}

3. flatMap

现在您可以使用功能强大的flapMap功能

let animals = animalList.flatMap { ModelAnimal(name: $0["name"], color: $0["color"]) }

为什么选择flatMap?

  1. flatMap在于它只返回非nil值 实际上, animalList包含非结构化数据,并且您不能保证(至少在编译时)每个元素都有一个name和一个color键。 这样,如果坏数据包含在animalList其简单丢弃。
  2. flatMap另一个优点是,它确实返回ModelAnimalarray ,而不是ModelAnimal?array ModelAnimal?

首先initialize您的ModelAnimal对象,然后将它们添加到数组中:

let animalOne = ModelAnimal(name: "ABC", color: "red")
let animalTwo = ModelAnimal(name: "DEF", color: "green")
let animalThree = ModelAnimal(name: "GHI", color: "blue")

let myList: Array<ModelAnimal> = [animalOne, animalTwo, animalThree]

您也可以在线执行此操作:

let myList: Array<ModelAnimal> = [ModelAnimal(name: "ABC", color: "red"), ModelAnimal(name: "DEF", color: "green"), ModelAnimal(name: "GHI", color: "blue")]

该代码仅遍历animalList并将新项目添加到myList

var myList = Array<ModelAnimal>()

for var i = 0; i < animalList.count; i++ {
    myList.append(ModelAnimal(name: animalList[i]["name"]!, color: animalList[i]["color"]!))
}

它可以工作,但是每次调用append都不会提高性能。 更好的方法是创建具有所需长度的数组:

for var i = 0; i < animalList.count; i++ {
    myList[i] = ModelAnimal(name: animalList[i]["name"]!, color: animalList[i]["color"]!)
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM