Ios 编辑行为不可变值的tableView

Ios 编辑行为不可变值的tableView,ios,swift,uitableview,Ios,Swift,Uitableview,我正在尝试编辑不可变值上的tableView行 当我允许在表上编辑时,我不断得到以下信息: 无法对不可变值使用mutating成员:“dataSet”是仅获取的属性 查看控制器。swift import UIKit class TableVC: UIViewController, UITableViewDataSource, UITableViewDelegate { @IBOutlet weak var table: UITableView! override func viewDidL

我正在尝试编辑不可变值上的tableView行

当我允许在表上编辑时,我不断得到以下信息:

无法对不可变值使用mutating成员:“dataSet”是仅获取的属性

查看控制器。swift

import UIKit

class TableVC: UIViewController, UITableViewDataSource, UITableViewDelegate {

@IBOutlet weak var table: UITableView!

override func viewDidLoad() {
    super.viewDidLoad()

    table.dataSource = self
    table.delegate = self

    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(TableVC.reloadTable(_:)), name: "reloadData", object: nil)

    DataHandler.inst.loadData()
   self.navigationItem.leftBarButtonItem = self.editButtonItem()
}

func reloadTable(notif: AnyObject) {
    table.reloadData()
}

func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 1
}

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return DataHandler.inst.dataSet.count
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cellOld = tableView.dequeueReusableCellWithIdentifier("PicsCell") as? PicsCell

    let cell = cellOld != nil ? cellOld! : PicsCell()

    cell.initializeCell(DataHandler.inst.dataSet[indexPath.row])

    return cell
}

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    let selectedPic = DataHandler.inst.dataSet[indexPath.row]
    let view = ImageVC(pic: selectedPic)

    presentViewController(view, animated: true, completion: nil)
}



func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath){


    if editingStyle == UITableViewCellEditingStyle.Delete{


     //Error here saying Cannot use mutating member on immutable value: 'dataSet' is a get-only property   
    //    DataHandler.inst.dataSet.removeAtIndex(indexPath.row)


        tableView.reloadData()


     }


   }

 }
static let inst = DataHandler()

private var _dataSet = [Pics]()

var dataSet: [Pics] {
    return _dataSet
}

func addPic(img: UIImage, title: String, description: String) {

    let imgName = saveMyImage(img)
    let entry = Pics(img: imgName, title: title, description: description)
    _dataSet.append(entry)

    saveData()
    loadData()
}

private func saveData() {
    let data = NSKeyedArchiver.archivedDataWithRootObject(_dataSet)
    NSUserDefaults.standardUserDefaults().setObject(data, forKey: "data")
    NSUserDefaults.standardUserDefaults().synchronize()
}

func loadData() {
    guard let data = NSUserDefaults.standardUserDefaults().objectForKey("data") as? NSData else {
        return
    }
    guard let array = NSKeyedUnarchiver.unarchiveObjectWithData(data) as? [Pics] else {
        return
    }

    _dataSet = array

    NSNotificationCenter.defaultCenter().postNotificationName("reloadData", object: nil)
}

private func saveMyImage(img: UIImage) -> String {
    let imgData = UIImagePNGRepresentation(img)
    let imgPath = "img\(NSDate.timeIntervalSinceReferenceDate()).png"
    let fullPath = getPathForImage(imgPath)

    imgData?.writeToFile(fullPath, atomically: true)
    return imgPath
}

private func getPathForImage(name: String) -> String {
    let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
    let fullPath = paths[0] as NSString
    return fullPath.stringByAppendingPathComponent(name)
}

func imagePathName(name: String) -> UIImage? {
    let path = getPathForImage(name)
    let img = UIImage(named: path)

    return img
   }
}
DataHandler.swift

import UIKit

class TableVC: UIViewController, UITableViewDataSource, UITableViewDelegate {

@IBOutlet weak var table: UITableView!

override func viewDidLoad() {
    super.viewDidLoad()

    table.dataSource = self
    table.delegate = self

    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(TableVC.reloadTable(_:)), name: "reloadData", object: nil)

    DataHandler.inst.loadData()
   self.navigationItem.leftBarButtonItem = self.editButtonItem()
}

func reloadTable(notif: AnyObject) {
    table.reloadData()
}

func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 1
}

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return DataHandler.inst.dataSet.count
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cellOld = tableView.dequeueReusableCellWithIdentifier("PicsCell") as? PicsCell

    let cell = cellOld != nil ? cellOld! : PicsCell()

    cell.initializeCell(DataHandler.inst.dataSet[indexPath.row])

    return cell
}

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    let selectedPic = DataHandler.inst.dataSet[indexPath.row]
    let view = ImageVC(pic: selectedPic)

    presentViewController(view, animated: true, completion: nil)
}



func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath){


    if editingStyle == UITableViewCellEditingStyle.Delete{


     //Error here saying Cannot use mutating member on immutable value: 'dataSet' is a get-only property   
    //    DataHandler.inst.dataSet.removeAtIndex(indexPath.row)


        tableView.reloadData()


     }


   }

 }
static let inst = DataHandler()

private var _dataSet = [Pics]()

var dataSet: [Pics] {
    return _dataSet
}

func addPic(img: UIImage, title: String, description: String) {

    let imgName = saveMyImage(img)
    let entry = Pics(img: imgName, title: title, description: description)
    _dataSet.append(entry)

    saveData()
    loadData()
}

private func saveData() {
    let data = NSKeyedArchiver.archivedDataWithRootObject(_dataSet)
    NSUserDefaults.standardUserDefaults().setObject(data, forKey: "data")
    NSUserDefaults.standardUserDefaults().synchronize()
}

func loadData() {
    guard let data = NSUserDefaults.standardUserDefaults().objectForKey("data") as? NSData else {
        return
    }
    guard let array = NSKeyedUnarchiver.unarchiveObjectWithData(data) as? [Pics] else {
        return
    }

    _dataSet = array

    NSNotificationCenter.defaultCenter().postNotificationName("reloadData", object: nil)
}

private func saveMyImage(img: UIImage) -> String {
    let imgData = UIImagePNGRepresentation(img)
    let imgPath = "img\(NSDate.timeIntervalSinceReferenceDate()).png"
    let fullPath = getPathForImage(imgPath)

    imgData?.writeToFile(fullPath, atomically: true)
    return imgPath
}

private func getPathForImage(name: String) -> String {
    let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
    let fullPath = paths[0] as NSString
    return fullPath.stringByAppendingPathComponent(name)
}

func imagePathName(name: String) -> UIImage? {
    let path = getPathForImage(name)
    let img = UIImage(named: path)

    return img
   }
}

您可以在此处将dataSet声明为仅获取属性:

var dataSet: [Pics] {
    return _dataSet
}
如果要对其进行变异,请添加一个setter:

var dataSet: [Pics] {
    get {
        return _dataSet
    }

    set(newSet) {
        _dataSet = newSet
    }

}
或者更改您的体系结构以使
\u数据集
公开