从字典和最佳实践更新变量值

时间:2018-02-01 16:49:35

标签: swift variables dictionary logic

随着我进入Swift教育,我需要时间来寻求有关最佳实践和代码优化的帮助。

我的应用程序每天变得越来越复杂,目前的情况如下:我开始使用字典和参数来使用单个函数,可以根据情况处理很多不同的变量,这似乎更好练习比使用5个不同的函数,只使用不同的变量做同样的事情。

我现在有两个文件如下:

Main1.swift:

class Main1 {

    static var value1 : Int = 1

    func updateValue(_ value: String) {

        let dict : [String : Int] = ["value1": Main1.value1]

        let dict1 = dict[value]
        guard var value = dict1 else { return }

        value = value + 1 // <- trying to update `static var value1`'s value from 1 to 2 here
        print(value)
    }
}

Main2.swift:

class Main2 {

    func updateValue(_ value: String) {

        let dict : [String : Int] = ["value1": Main1.value1] // <- thinking `value1` would now be 2

        let dict1 = dict[value]
        guard var value = dict1 else { return }

        value = value + 1 // <- trying to get 3 here
        print(value)
    }
}

这些类是我的代码的简化版本,但逻辑是相同的:我正在尝试使用从字典加载的变量并更新它们的值以用于另一个文件和函数:

Main1().updateValue("value1") //2
Main2().updateValue("value1") //2 <--- I need 3 here!

- &GT; 我到底想要实现的目标是什么?

通过字典方便(或不同的方法,但你得到关于方便的观点)更新参考(静态var value1:Int = 1)值。

实际上我在通过字典访问Main1.value1时尝试Main1.value1 = Main1.value1 + 1,这是不可能的,因为我没有在这里访问引用。

我知道这不起作用,我在这里有3个不同的value副本,但我不知道如何在不使用其他全局变量的情况下更新变量值...我需要你的帮助才能找到更好的逻辑。

我对任何建议或想法持开放态度。我不是要求代码解决方案(无论如何都会很棒)但是我很想让我的教育重新集中一点,我开始失去自己一个人学习,而挫折来自于我没有知道该怎么做了。

1 个答案:

答案 0 :(得分:2)

EDIT BASED ON COMMENTS

As per the comments below, here's a potential solution:

class Main1 {

    static var dict: [String: Int] = ["value1": 1]

    func updateValue(_ key: String) {

        guard var value = dict[key] else { return }

        value = value + 1 
        print(value)

        dict[key] = value
    }
}

ORIGINAL ANSWER

In Swift, [String : Int], String and Int are value types, as opposed to their Objective-C counterparts NSDictionary, NSString and NSNumber, which are reference types.

This means that when you do guard var value = dict1 else { return }, value is now a copy of what the dictionary contained, not a reference to that piece of data inside the dictionary.

So when you do value = value + 1 you're setting the new variables value, but not the contents of the dictionary.

Following your logic, you need to put value back into the dictionary, like this:

func updateValue(_ value: String) {
    var dict : [String : Int] = ["value1": Main1.value1] // <- Change this to a var

    let dict1 = dict[value]
    guard var intValue = dict1 else { return }

    intValue = intValue + 1 // <- trying to update `static var value1`'s value from 1 to 2 here
    print(intValue)

    dict[value] = intValue // <- ADD THIS
}