【问题标题】:Store Array of custom Objects Swift存储自定义对象数组 Swift
【发布时间】:2023-03-12 15:04:01
【问题描述】:

我有一个名为“Entry”的课程。

在那里我有不同的变量,如 Int、NSDate 和 Float。

我有一个由这些元素组成的数组“listData”。

这个“listData”正在填充一个 TableView。如何存储和读取这个数组?实现会是什么样子?

我尝试遍历数组并保存“Entry”类的单个元素,以便在加载时将其重新组合在一起。它似乎无法正常工作。

这是我的一些代码:

我的入门班:

import Foundation

class Entry  {

let number      : Int
let date        : NSDate
let mileage     : Int
let trip        : Float
let speed       : Float
let consumption : Float

init(number: Int, date: NSDate, mileage: Int, trip: Float, speed: Float, consumption: Float) {


    self.number         = number
    self.date           = date
    self.mileage        = mileage
    self.trip           = trip
    self.speed          = speed
    self.consumption    = consumption
    }
}

然后我有一个数组的全局变量:

var listData = [Entry]()

在第二个 ViewController 上,我声明了一些接受 Textfield 输入的变量,以将它们保存到新的“条目”对象中,然后将其附加到 listData 数组中:

listData.append(Entry(number: number_pass, date: date_pass, mileage: mileage_pass, trip: trip_pass, speed: speed_pass, consumption: consumption_pass))

我在代码中的所有其他内容只是设置和管理 Tableviews。

有没有办法使用 UserDefaults?还是我必须使用 CoreData?

希望您能提供帮助! 干杯,尼克拉斯

【问题讨论】:

    标签: arrays object swift save


    【解决方案1】:

    如果你不想使用 NSUserDefaults,你可以使用 Core Data。这第一堂课只是为了让事情变得更容易:

    class CoreDataHelper: NSObject {
    
        class func insertManagedObject(className: String, moc: NSManagedObjectContext) ->AnyObject {
            let managedObject: NSManagedObject = NSEntityDescription.insertNewObjectForEntityForName(className, inManagedObjectContext: moc) as! NSManagedObject
            return managedObject
        }
    
        class func fetchEntities(className: String, withPredicate predicate: NSPredicate?, moc: NSManagedObjectContext) -> NSArray {
            let request: NSFetchRequest = NSFetchRequest()
            let entityDescription: NSEntityDescription = NSEntityDescription.entityForName(className, inManagedObjectContext: moc)!
    
            request.entity = entityDescription
    
            if predicate != nil {
                request.predicate = predicate!
            }
    
            request.returnsObjectsAsFaults = false
    
            let items: NSArray = moc.executeFetchRequest(request, error: nil)!
            return items
         }
    
    }
    

    在你的 ViewController 中:

    @IBOutlet weak var myTableView: NSTableView!
    
    // Your datastore
    private var myArray = [Entry]()
    
    // ManagedObjectContext
    lazy var moc: NSManagedObjectContext? = {
        let appi = NSApplication.sharedApplication().delegate as! AppDelegate
        if let moc = appi.managedObjectContext {
            return moc
        } else {
            return nil
        }
        }()
    
    func reloadTableView(sender: AnyObject) {
        let request = NSFetchRequest(entityName: "Entry")
    
        // Just an example of sort descriptor
        request.sortDescriptors = [NSSortDescriptor(key: "date", ascending: false)]
    
        var anyerror: NSError?
    
        let fetchedEntries = moc?.executeFetchRequest(request, error: &anyerror)
    
        if fetchedEntries == nil {
            println("Error fetching: \(anyerror)")
            return
        }
    
        myArray = fetchedEntries as! [Entry]
    
        myTableView.reloadData()
    }
    
    // Life cycle
    override func viewDidLoad() {
        super.viewDidLoad()
    
        reloadTableView(self)
    
    }
    

    【讨论】:

    • 在创建项目之前是否必须选中“使用 CoreData”复选框?还是没有这行得通?由于我在创建项目时没有检查它
    • 是的,然后你必须为你的班级制作实体。我不确定在现有项目中添加 Core Data Model 有多容易,因为 Xcode 在您选中该框时已经提供了一些功能。
    • 谢谢!我将尝试在启用 CoreData 的情况下构建它。
    • 您的代码抛出错误:/ let appi = NSApplication.sharedApplication().delegate as! AppDelegate“使用未解析的标识符‘NSApplication’”
    • 不知道为什么。这是很好的核心数据教程link
    猜你喜欢
    • 2019-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多