![](/img/trans.png)
[英]Siesta Swift Casting from ImplicitlyUnwrappedOptional<Swift.AnyObject> to Array<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
。
首先建议,使用Struct
而不是Class
模型。
为什么要构造?
failable init
,可以返回失败,但不会初始化所有存储的性能。 name
和color
字段不变,则应将它们声明为let
。 这样,您的Struct将会完全不可变(这有几个方面的好处)。 向您的模型添加一个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
}
}
现在您可以使用功能强大的flapMap
功能
let animals = animalList.flatMap { ModelAnimal(name: $0["name"], color: $0["color"]) }
为什么选择flatMap?
flatMap
在于它只返回非nil值 。 实际上, animalList
包含非结构化数据,并且您不能保证(至少在编译时)每个元素都有一个name
和一个color
键。 这样,如果坏数据包含在animalList
其简单丢弃。 flatMap
另一个优点是,它确实返回ModelAnimal
的array
,而不是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.