2017-01-10 2 views
0

Ich studiere Swift. Ich möchte den Beitrag mit UITableViewCellEditingStyle entfernen, aber es funktioniert nicht. Es zeigt:Wie man Swift 3 Fehler beheben kann 'kann nicht mutieren Mitglied auf unveränderlichen Wert:' loadedPost 'nur Eigentum erhalten'?

kann Mitglied nicht auf unveränderlichen Wert verwenden mutiert: ‚loadedPost‘

in der Linie nur Eigentum:

Dataservice.instance.loadedPosts.removeAtIndex(indexPath.row) 

Wie behebe ich die Syntax? Diese

zuerst Viewcontroller:

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { 
    if editingStyle == .delete { 
     DataService.instance.loadedPosts.removeAtIndex(indexPath.row) //‘cannot use mutating member on immutable value: ‘loadedPost’ get only property’ 
     self.onPostsLoaded() 
    } 
} 

Dies ist Array in einer anderen Datei:

class DataService { 
    static var instance = DataService() 

    private var _loadedPosts = [Post]() 

    var loadedPosts: [Post] { 
     return _loadedPosts 
    } 

    func savePosts() { 
     let postsData = NSKeyedArchiver.archivedData(withRootObject: _loadedPosts) 
     UserDefaults.standard.set(postsData, forKey: "posts") 
    } 

    func loadPosts() { 
     if let postsData = UserDefaults.standard.object(forKey: "posts") as? Data { 

      if let postsArray = NSKeyedUnarchiver.unarchiveObject(with: postsData) as? [Post] { 
       _loadedPosts = postsArray 
      } 
     } 

     NotificationCenter.default.post(Notification(name: Notification.Name(rawValue: "postsLoaded"), object: nil)) 

    } 

    func addPosts(post: Post) { 
     _loadedPosts.append(post) 
     savePosts() 
     loadPosts() 
    } 
+0

'loadedPosts' schreibgeschützt ist Eigentum von Ihrer Definition, die' _loadedPosts' wird Lese-Schreib-Eigenschaft, auch, indem Sie Ihre Definition. – holex

Antwort

1

Könnte es nur sein, dass Sie die öffentliche Array in Ihrem Singleton loadedPosts mit einem Getter und ohne Setter angeben dh mit diesem Ansatz können Sie es nicht mutieren. Providing ein Setter sollte funktionieren?

d. H. Getter nur hier brauchen Sie auch einen Setter.

var loadedPosts: [Post] { 
    return _loadedPosts 
} 

vielleicht wie diese

var loadedPosts: [Post] { 
    get{ 
     return _loadedPosts 
    } set{ 
     _loadedPosts = newValue 
    } 
} 
+0

wie man einen Setter macht ?. Ich bin neu dafür. Haben Sie auch eine Antwort auf die Fragen 2 und 3? – Andyopf

+0

Der Code oben, wo ich sage "vielleicht so". Hier bieten Sie einen Getter und Setter. Hier ist es wieder var loadedPosts: [Beitrag] { get { return _loadedPosts } Menge { _loadedPosts = newValue } } –

+0

zu erhalten hinzuzufügen bedeutet, die Daten zu lesen und Satz bedeutet, dass die Daten der Variablen zugewiesen werden. Und in diesem Fall möchten Sie Ihr Array löschen, so dass Sie in der Lage sein müssten, in die Variable –

Verwandte Themen