2015-07-01 6 views
0

Я использую фреймворк, который асинхронно загружает данные из кеша устройства и возвращает его. Однако метод, определение которого я не могу изменить, возвращает массив из AnyObject. У меня есть класс под названием 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) ") 
    } 
} 

Attendee Определение класса

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" 
    } 


} 
+0

Можете ли вы опубликовать код, в котором вы пытались вызвать массив, и получили ошибку времени выполнения. Вы должны просто иметь возможность делать объект как! [Attendee] ' – sbarow

+2

, а не говорить о вас код, вы должны показать его. – vikingosegundo

ответ

0

Есть ли более эффективный способ преобразования [AnyObject] в [Attendee], чем просто пробегаем по ней

No. Даже прямой бросок с as! таит в петлю, так как оно должен бросать отдельные объекты. Фактически, это то, почему вы терпите крах - скрытый цикл достигает объекта в массиве, который он не может отличить.

1

Может карта будет работать?

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

Это комментарий или ответ?Если у вас есть конкретный ответ, опубликуйте его. В противном случае отправьте комментарий по этому вопросу. – JAL

0

К описанию модели anyObjectArray, используйте как !. Убедитесь, что у вас есть восклицательный знак.

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

Надеюсь, это поможет!

0

Если вы получаете ошибку времени выполнения с оператором typecasting как! это может означать, что массив содержит не только экземпляры класса Attendee.

Компилятор не может знать наверняка до выполнения, что все элементы в массиве могут быть отключены до указанного вами типа, чтобы вы могли получить ошибку во время выполнения, если вы используете принудительный приведение.

Есть два способа потупив массив:

Safe одно:

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 attendee in anyObjectArray as! [Attendee] { 
    // aView is of type UIView 
} 

Этот бросок вынужденный бросок, и приводит к ошибке во время выполнения, если бросок не получится.

И, наконец, если в вашем массиве есть элементы разных типов, вам нужно будет отфильтровать массив.

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

IMO вы перепутали безопасно и небезопасно: если в массиве, как ожидается, будут присутствовать только экземпляры Attendee, было бы лучше, если бы приложение сработало, чем изящно игнорировать его. – vikingosegundo

+0

Возможно, вы правы. Я только немного изменил свой код. – agy

Смежные вопросы