L'ajout de l'élément de tableau dans iOS avec Swift
Je suis en train d'ajouter un élément de mon tableau (qui a été déclaré comme un var), à l'aide de quelque chose qui pourrait fonctionner (+=, ajouter, insérer), mais je reçois l'erreur " Immuable valeur de type 'AnyObject[]' a seulement la mutation de membres nommé "ajouter".
Ici est l'endroit où l'erreur se produit:
func testSave(item : NSString, date : NSString){
itemsArray.append(item)
MISE À JOUR: VOICI LE CODE COMPLET:
import UIKit
class ToDoListTableViewController: UITableViewController, UITableViewDelegate, UITableViewDataSource, UIAlertViewDelegate {
var itemsArray = NSUserDefaults .standardUserDefaults().arrayForKey("items")
var dateArray = NSUserDefaults .standardUserDefaults().arrayForKey("dates")
override func viewDidLoad() {
super.viewDidLoad()
NSUserDefaults .standardUserDefaults().setObject("test", forKey: "items")
NSUserDefaults .standardUserDefaults().setObject("test", forKey: "dates")
self.itemsArray = NSUserDefaults .standardUserDefaults().arrayForKey("items")
self.dateArray = NSUserDefaults .standardUserDefaults().arrayForKey("dates")
//Uncomment the following line to preserve selection between presentations
//self.clearsSelectionOnViewWillAppear = false
//Uncomment the following line to display an Edit button in the navigation bar for this view controller.
//self.navigationItem.rightBarButtonItem = self.editButtonItem
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
//Dispose of any resources that can be recreated.
}
//#pragma mark - Table view data source
override func numberOfSectionsInTableView(tableView: UITableView?) -> Int {
//#warning Potentially incomplete method implementation.
//Return the number of sections.
return 1
}
override func tableView(tableView: UITableView?, numberOfRowsInSection section: Int) -> Int {
//Return the number of rows in the section.
if itemsArray{
return itemsArray.count}
else{
return 0}
}
override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell!{
//variable type is inferred
/*var cell = tableView.dequeueReusableCellWithIdentifier("Cell") as? UITableViewCell
if !cell {
cell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "Cell")
}
//we know that cell is not empty now so we use ! to force unwrapping
cell!.textLabel.text = self.itemsArray[indexPath.row] as String
cell!.detailTextLabel.text = self.dateArray[indexPath.row] as String
*/
let cell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier:"Cell")
if itemsArray{
println("Working")
cell.textLabel.text = itemsArray[indexPath.row] as String
cell.detailTextLabel.text = dateArray[indexPath.row] as String
}
return cell
}
@IBAction func addItem(sender : UIBarButtonItem) {
var alert = UIAlertController(title: "Alert", message: "Message", preferredStyle: UIAlertControllerStyle.Alert)
alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.Default, handler: {(action: UIAlertAction!) in
var stringText = alert.textFields[0].text
var dateText = alert.textFields[0].text
self .testSave(stringText, date: dateText)
}))
alert.addTextFieldWithConfigurationHandler(nil)
self.presentViewController(alert, animated: true, completion: nil)
}
func testSave(item : NSString, date : NSString){
itemsArray.append(item)
/* NSUserDefaults .standardUserDefaults().setObject(item, forKey: "items")
/* NSUserDefaults .standardUserDefaults().setObject(stringText, forKey: "items")
NSUserDefaults .standardUserDefaults().setObject(dateText, forKey: "dates")
NSUserDefaults.standardUserDefaults().synchronize()
*/
self.dateArray = NSUserDefaults .standardUserDefaults().arrayForKey("dates")
self.tableView .reloadData() */
}
func alertviewClick(){
}
}
À partir de l'erreur, il semble que
Il semble que la cause de votre problème se trouve à l'extérieur de code indiqué. Pouvez-vous montrer plus de code, et en particulier comment itemsArray vient dans le champ d'application - est-il un iVar? reçu à partir d'une autre fonction? Déclaré localement?
J'ai mis à jour ma réponse avec le code complet:
itemsArray
est immuable. Est-il défini avec let
ou var
?Il semble que la cause de votre problème se trouve à l'extérieur de code indiqué. Pouvez-vous montrer plus de code, et en particulier comment itemsArray vient dans le champ d'application - est-il un iVar? reçu à partir d'une autre fonction? Déclaré localement?
J'ai mis à jour ma réponse avec le code complet:
OriginalL'auteur Jack Solomon | 2014-06-09
Vous devez vous connecter pour publier un commentaire.
Cela fonctionne bien:
NSUserDefaults.standardUserDefaults().arrayForKey("articles") est un non-mutable tableau. Vous devez instancier itemsArray comme une mutable tableau afin d'être autorisé à ajouter des éléments.
OriginalL'auteur Dash
Problème est ici:
Voir la Pomme de document:
les valeurs défini à l'origine, ont été mutable.
Mais si vous êtes sûr à 100% que "éléments" n'est pas un vide
NSArray
, alors vous pouvez abattu à Matrice de.append()
:Si le retour de l'objet à partir de
.arrayForKey()
estnil
ou ne peut pas être jeté à la Matrice (par exemple, c'est les objets ne peut pas être intégré dans Swift type), une erreur se lever comme il ne peut pas déballer l'option.OriginalL'auteur Cai
Mettre ce code dans le bac à sable et vous verrez que la valeur "bonjour" est ajouté correctement. Essayer de comprendre ce qui est différent entre mon code et le vôtre sera une excellente expérience d'apprentissage pour vous:
OriginalL'auteur Daniel T.
Ce n'est pas que votre code est syntaxiquement faux, c'est juste que la méthode "arrayForKey" se donne toujours à fond immuable de la matrice de laquelle vous ne pouvez pas modifier.
Vous essayez d'ajouter, ce qui modifie la longueur, donc il n'est pas permis.
Vous pouvez le vérifier dans la documentation voici un extrait pour la valeur de retour:
OriginalL'auteur iQ.
Si vous faites de Mélange et de Match (migre progressivement de l'objc swift)
Ensuite utiliser
Le remplacement de
append
vous êtes à la recherche pour estaddObject
Espère que cela aide quelqu'un dans le futur.
OriginalL'auteur jeet.chanchawat
Même si vous déclarer quelque chose comme le var, il a toujours besoin d'un type pour être autre chose que AnyObject. Var je crois, c'est juste un mot-clé déclarant que l'identifiant suivant (le nom de la variable) doit être déduit par l'affectation d'
Puisque vous voulez une Mutable Tableau essayer cette
ou
Edit: je Ne sais pas pourquoi je reçois des pouces vers le bas. Maintenant que la question a été mis à jour il me semble que j'avais raison. Lorsque vous avez appelé
Le type de retour est NSArray. Le type inféré pour la variable itemsArray est donc NSArray, ce qui n'est pas mutable. Par conséquent, l'envelopper dans une mutable tableau
Je ne suis pas sûr de ce que tu veux dire par Objective-C tableau. NSMutableArray est une partie de l'iOS cadre, donc j'imagine que la swift adaptation du cadre de l'utilisation de swift tableaux?
En Objective-C tableau je veux dire NSArray ou NSMutableArray qui font partie de la Fondation de cadre. Swift tableaux de type Array<T>, et ils ne sont pas liés à des tableaux trouvés dans le cadre de la Fondation.
Ok, je comprends ce que vous dites. Juste pour clarifier, êtes-vous sûr que le principe de base n'a pas été reconstruite avec swift et l'utilisation de swift tableaux?
Oui, évidemment, ils sont classes, ma question est comment êtes-vous sûr que ces classes n'ont pas reconstruit à l'aide swift tableaux?
OriginalL'auteur Literphor