2016-12-15 5 views
0

О переносе приложения iOS в Swift 3.0. Вот один вопрос, с которым я столкнулся.Тип '[XYZ]!' не имеет подстрочных индексов

Сначала соответствующий код:

struct OnlineBox { 
    var vf1,vf2:CGFloat! 
    var vs1:String! 
} 

var myOnlineInfo:[OnlineBox]! 

func doSomeWork() { 
    myOnlineInfo = [OnlineBox](repeating: OnlineBox(vf1: 0.0, vf2: 0.0, vs1: ""), count: 11) 

    // below someInfoArray comes from querying a Core Data Entity: 
    for item in someInfoArray { 
     myOnlineInfo[(item.valueForKey("keyOne") as! Int) - 1].vf1 = item.valueForKey("vf1") as! CGFloat 
     myOnlineInfo[(item.valueForKey("keyOne") as! Int) - 1].vf2 = item.valueForKey("vf2") as! CGFloat 
     myOnlineInfo[(item.valueForKey("keyOne") as! Int) - 1].vs1 = item.valueForKey("vs1") as! String 
    } 
} 

Вторая проблема:

Я получаю это сообщение таинственное об ошибке, для 3-х строк внутри цикла:

Type '[OnlineBox]!' has no subscript members 

Другими словами массив не имеет элементов индекса. Я не совсем понимаю.

Как мне изменить код?

+0

Покажите свой someInfoArray. Это похоже на «[[« keyOne »: 1,« vf1 »: 0.0 ...], [" keyOne ": 2," vf1 ": 0.0] ...] '? – Satachito

+0

Я могу показать someInfoArray, но что бы это ни было "(item.valueForKey (" keyOne ") as! Int)" должен быть Int, остальное не должно иметь значения. Я ошибаюсь? – Michel

+0

Теперь вы можете увидеть, откуда появился someInfoArray. – Michel

ответ

0

Предполагая, что ваш someInfoArray является массивом словаря.

«Элемент» теперь является экземпляром словаря, который не отвечает методу valueForKey.

Отбросьте его в NSDictionary, чтобы ответить valueForKey.

for item in someInfoArray { 
    let i = item as NSDictionary 
    myOnlineInfo[(i.valueForKey("keyOne") as! Int) - 1].vf1 = i.valueForKey("vf1") as! CGFloat 
    myOnlineInfo[(i.valueForKey("keyOne") as! Int) - 1].vf2 = i.valueForKey("vf2") as! CGFloat 
    myOnlineInfo[(i.valueForKey("keyOne") as! Int) - 1].vs1 = i.valueForKey("vs1") as! String 
} 

или просто

for item in someInfoArray { 
    myOnlineInfo[(item["keyOne"] as! Int) - 1].vf1 = item["vf1"] as! CGFloat 
    myOnlineInfo[(item["keyOne"] as! Int) - 1].vf2 = item["vf2"] as! CGFloat 
    myOnlineInfo[(item["keyOne"] as! Int) - 1].vs1 = item["vs1"] as! String 
} 
+0

этот ответ поставил меня на правильный путь (и я, наконец, сделал его работу), поэтому я нажимаю на него, как принято. Я все еще не думаю, что сообщение об ошибке подходит. Он должен четко сказать, что то, что я предоставляю в качестве индекса, не соответствует типу. – Michel

+0

Согласен, что сообщение об ошибке не говорит правду. Пожалуйста, напишите отчет об ошибке для яблока. – Satachito

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

  • Нет связанных вопросов^_^