Swift 让结构在我的第一个视图控制器中工作? [英] Swift getting struct to work in my first view controller?

查看:21
本文介绍了Swift 让结构在我的第一个视图控制器中工作?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我开始使用结构体,现在我被困在第一个 VC 上,它在另一个 VC 中按我的预期工作.这是我在我的第一个 VC 中的内容(我应该在单独的文件中有结构吗?)

I am getting into using struct and now i am stuck on the first VC, it works as i expect in another VC. Here's what i have in my first VC (should i have struct in a seperate file?)

我需要使用 lVisitors = ListVisitors.sharedInstance 在我的第一个 VC 中填充 tableview(其他 VC 似乎工作)

I need to use the lVisitors = ListVisitors.sharedInstance to populate a tableview in my first VC (other VC seems to work)

    struct ListVisitors{
    static var sharedInstance = [Visitor]()

    static func register()
    {
        //NSUserDefaults.standardUserDefaults().registerDefaults( ["tasks" : [String]()])
    }

    static func load()
    {
        //Task.tasks = NSUserDefaults.standardUserDefaults().objectForKey("tasks") as! [String]
    }

    static func save()
    {
        //NSUserDefaults.standardUserDefaults().setObject(Task.tasks, forKey:"tasks")
    }

    static func append(visitor : Visitor)
    {
        //Task.tasks.append(string)
         ListVisitors.sharedInstance.append(visitor)
    }

}

class ScannerViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, AVCaptureMetadataOutputObjectsDelegate {

现在在第一个 VC 中不起作用但在另一个 VC 中似乎可以工作的部分

Now the part which doesn't work in first VC but does seem to work in the other VC

第一个 VC 返回 Global 0

First VC return Global 0

let lVisitors = ListVisitors.sharedInstance

    override func viewDidLoad() {
        super.viewDidLoad()

        // global testing
        self.testPopulateData()       
        print("Global \(lVisitors.count)")

func testPopulateData 添加一些测试数据到 ListVisitors.sharedInstance

func testPopulateData adds some test data to the ListVisitors.sharedInstance

其他VC返回test4

Other VC returns test4

let lVisitors = ListVisitors.sharedInstance

    override func viewDidLoad() {
        super.viewDidLoad()        

        print(" test\(lVisitors.count)")
    }

在我的第一个 VC 中,在 func var ListVisitors.sharedInstance 中似乎有值,例如

In my first VC, Within a func var ListVisitors.sharedInstance seems to have values, like

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    let lVisitors = ListVisitors.sharedInstance //shouldn't have to

    print("Row Global \(lVisitors.count)")
    return scannedVisitors.count //other test way
}

我想我想出了一个可行的解决方案(tx @vadian 和 @Entalpi)

I think i came up with a workable solution (tx @vadian and @Entalpi)

我将 testPopulateData 函数添​​加到我的自定义类中并将其重命名为 load()(将来我喜欢用 webservice 文件替换它).在我的第一个 VC 中声明了一个实例变量

I added the testPopulateData function into my custom class and renamed it load() (in the future i like to replace this with a webservice file). And in my first VC after declaring an instance variable

var lVisitors = [Visitor]()

我在 viewDidLoad() 中添加了以下内容

i added the followin in viewDidLoad()

ListVisitors.load()
  lVisitors = ListVisitors.sharedInstance

这个类似乎有效,但 @vadian 推荐单例,那么我如何将这个类重写为单例?

This class seems to work but @vadian recommends a singleton, so how do i rewrite this class into a singleton?

class ListVisitors{
static var sharedInstance = [Visitor]()

//init(sharedInstance:Visitor){//self.sharedInstance = sharedInstance//}

// init(sharedInstance:Visitor){ // self.sharedInstance = sharedInstance // }

static func register()
{
    //NSUserDefaults.standardUserDefaults().registerDefaults( ["tasks" : [String]()])

}

static func load()
{
    //Task.tasks = NSUserDefaults.standardUserDefaults().objectForKey("tasks") as! [String]
    var visitor = Visitor(visitorName: "From Class Matt", visitorCompany: "Google", visitorPlace: "San Diego", visitorPhone: "94888484", visitorEmail: "matt@google.com")
    sharedInstance = [visitor]

    visitor = Visitor(visitorName: "From Class John", visitorCompany: "nike", visitorPlace: "New York", visitorPhone: "94888484", visitorEmail: "john@nike.com")
    //        ListVisitors.sharedInstance += [visitor]
    sharedInstance += [visitor]

    visitor = Visitor(visitorName: "From Class Troy", visitorCompany: "nike", visitorPlace: "New York", visitorPhone: "94888484", visitorEmail: "troy@nike.com")
    //        ListVisitors.sharedInstance += [visitor]
    sharedInstance += [visitor]
    // append
    visitor = Visitor(visitorName: "From Class Julian", visitorCompany: "leica", visitorPlace: "Tokyo", visitorPhone: "123411234", visitorEmail: "julian@shoot.co.jp")
    //        ListVisitors.append(visitor)
    sharedInstance.append(visitor)

}

static func save()
{
    //NSUserDefaults.standardUserDefaults().setObject(Task.tasks, forKey:"tasks")
}

static func append(visitor : Visitor)
{
    //Task.tasks.append(string)
    ListVisitors.sharedInstance.append(visitor)
}

static func delete(index: Int) {
    ListVisitors.sharedInstance.removeAtIndex(index)
    print("remove item")
}

}

推荐答案

结构体的特点是它们是值类型,因此在传递它们时会被复制.

The thing with structs is that they are value types and thus are copied when you pass them around.

您正在更改一个 VC 中结构的一个副本,而另一个 VC 使用不同的副本,并且无法看到对第一个 VC 的结构副本所做的更改.

You are changing one copy of the struct in one VC and the other VC sits with a different copy and cannot see the changes made to the first VC's copy of the struct.

这篇关于Swift 让结构在我的第一个视图控制器中工作?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆