2016-04-12 4 views
0

Я сделал поиск, но до сих пор не могу понять, как решить эту ошибку. В основном я читаю список книг из файла Json, а затем обновляю его. Часть чтения прекрасна, но ошибка («Невозможно назначить неизменяемое выражение типа« AnyObject ?! ») при попытке обновления.Невозможно назначить неизменяемое выражение типа «AnyObject ?!»

var url = NSBundle.mainBundle().URLForResource("Book", withExtension: "json") 

var data = NSData(contentsOfURL: url!) 

var booklist = try! NSJSONSerialization.JSONObjectWithData(data!, options: []) as! NSMutableArray 


for boo in booklist { 
      if (boo["name"] as! String) == "BookB" { 
       print (boo["isRead"]) //see Console Output 
       boo["isRead"] = "true" //this gets error "Cannot assign to immutable expression of type ' AnyObject?!'" 
      } 

Json файл Book.json, как показано ниже:

[ 
{"name":"BookA","auth":"AAA","isRead":"false",}, 
{"name":"BookB","auth":"BBB","isRead":"false",}, 
{"name":"BookC","auth":"CCC","isRead":"false",}, 
] 

Booklist имеет ожидаемые значения, см Консольный вывод:

(
     { 
     name = BookA; 
     auth = AAA; 
     isRead = false; 
    }, 
     { 
     name = BookB; 
     auth = BBB; 
     isRead = false; 
    }, 
     { 
     name = BookC; 
     auth = CCC; 
     isRead = false; 
    } 
) 

и print (boo["isRead"]), результат консоли Optional(false) , что правильно.

Booklist уже NSMutableArray, и я также пытался изменить, как

var booklist = try! NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as! NSMutableArray 

, но это не помогает.

Также упоминается Swift: Cannot assign to immutable expression of type 'AnyObject?!', изменяя ниже также получить ту же ошибку:

var mutableObjects = booklist 
for var boo in mutableObjects { 
      if (boo["name"] as! String) == "BookB" { 
       print (boo["isRead"]) //see Console Output 
       boo["isRead"] = "true" //this gets error "Cannot assign to immutable expression of type ' AnyObject?!'" 
      } 

Может кто-нибудь посоветовать, как обновить isRead в Booklist для BookB в этом случае. Или даже лучше, как обновить файл Book.json.

спасибо.

+0

Возможного дубликатом [Swift: Невозможно присвоить неизменное выражение типа «AnyObject ?!»] (http://stackoverflow.com/ вопросы/32093692/swift-can not-assign-to-immutable-expression-of-type-anyobject) – Lasse

+0

решение в этом вопросе не работает для меня ... – Adaoli

+0

Вы правы. Я опубликовал рабочий ответ – Lasse

ответ

0

В вашем случае вы нажмете эту ошибку дважды:

  1. в for цикле, который вы правильно отредактированной
  2. , потому что компилятор не знает тип boo (это всего лишь элементом NSMutableArray .

Чтобы исправить это, вы могли бы написать

for var boo in mutableObjects { 
    if var theBoo = boo as? NSMutableDictionary { 
     if (theBoo["name"] as! String) == "BookB" { 
      print (theBoo["isRead"]) //see Console Output 
      theBoo["isRead"] = "true" //this gets error "Cannot assign to immutable expression of type ' AnyObject?!'" 
     } 
    } 
} 

Или вы даете компилятору подсказку о типе boo с

guard let theBoos = mutableObjects as? [Dictionary<String, AnyObject>] else { 
     return 
    } 

    for var theBoo in theBoos { 
     if (theBoo["name"] as! String) == "BookB" { 
      print (theBoo["isRead"]) //see Console Output 
      theBoo["isRead"] = "true" //this gets error "Cannot assign to immutable expression of type ' AnyObject?!'" 
     } 
    } 
+0

спасибо! он работает отлично. – Adaoli

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