对数组进行类型转换的最有效方法

时间:2015-07-01 16:01:00

标签: ios arrays swift casting

我正在使用一个框架,它从设备的缓存中异步加载数据并返回它。但是,该方法(我的定义无法更改)会返回AnyObject s的数组。我有一个名为Attendee的类,我确信这些对象属于。我需要将[AnyObject]数组转换为[Attendee]数组。目前,我通过整合返回的数组,对各个对象进行类型转换,并将其存储在其他地方。我试图对数组进行类型转换,但是我在类型转换时得到了一个快速的运行时错误。有没有更有效的方法将[AnyObject]转换为[Attendee]而不仅仅是循环它?

var attendees: [Attendee] = []
let query = PFQuery(className: "Attendee")
query.findObjectsInBackgroundWithBlock { (objects: [AnyObject]!, error: NSError!) -> Void in
    if( error == nil ) {
        attendees = objects as! [Attendee]
    } else {
        println("Error fetching attendees: \(error) ")
    }
}

参加者课程定义

class Attendee: PFObject, PFSubclassing {

    override class func initialize() {
        var onceToken : dispatch_once_t = 0;
        dispatch_once(&onceToken) {
            self.registerSubclass()
        }
    }

    class func parseClassName() -> String! {
        return "Attendee"
    }


}

4 个答案:

答案 0 :(得分:1)

也许地图会起作用?

let arrayOfAttendee : [Attendee] = arrayOfAnyObjects.map{$0 as! Attendee}

答案 1 :(得分:0)

要对数组anyObjectArray进行类型转换,请使用!确保你有感叹号。

let anyObjectArray: [AnyObject] = ["Hi", "1", "3"]
let castedArray = anyObjectArray as! [String]

希望这有帮助!

答案 2 :(得分:0)

如果您收到类型转换操作符的运行时错误!这可能意味着数组不仅包含Attendee类的实例。

编译器在运行时之前无法确切知道数组中的所有元素都可以下载到您指定的类型,因此如果使用强制转换,您可能会收到运行时错误。

有两种方法可以向下转换数组:

安全的一个:

if let attendeeArray = anyObjectArray as? [Attendee] {
    // If we are here means that attendeeArray contains only Attendee objects
    for attendee in attendeeArray{

    }
} else{
   // You should warn someone if you were expecting just attendee elements
}

如果Swift数组中的任何元素在运行时实际上不是Attendee对象,则强制转换返回nil并且for block in block不会被执行。

不安全的人:

for attendee in anyObjectArray as! [Attendee] {
    // aView is of type UIView
}

此强制转换是强制转换,如果转换不成功,则会导致运行时错误。

最后,如果你的数组中有不同类型的元素,你需要过滤数组。

let attendeeArray = anyObjectArray.filter() {
    return ($0 is Attendee) 
}

答案 3 :(得分:0)

  

是否有更有效的方法将[AnyObject]转换为[Attendee]而不仅仅是循环它

没有。即使是使用as!的直接强制转换也会隐藏循环,因为它必须强制转换单个对象。事实上,这就是你崩溃的原因 - 隐藏的循环到达了它无法施放的数组中的对象。