【问题标题】:Updating variable value from dictionary and best practice从字典和最佳实践中更新变量值
【发布时间】:2018-02-01 16:49:35
【问题描述】:

随着我接受 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!

-> 我到底想在这里实现什么?

更新引用 (static var value1 : Int = 1) 值,同时通过方便的字典访问它(或不同的方法,但你明白了方便的意义)。

事实上,我在通过字典访问 Main1.value1 时尝试做Main1.value1 = Main1.value1 + 1,这是不可能的,因为我没有在此处访问参考。

我知道这行不通,我在这里有 3 个不同的 value 副本,但我不知道如何在不使用另一个全局变量的情况下更新变量值...我需要你的帮助来找到更好的逻辑。

我愿意接受任何建议或想法。我不是要求代码解决方案(无论如何都会很棒),但我希望我的教育重新集中一点,我开始迷失自己的学习,而挫败感来自于我没有知道要寻找什么了。

【问题讨论】:

  • 这听起来像是 XY 问题。你到底想做什么?
  • 我正在尝试在函数中使用一些变量,更新它们(更改它们的值),然后将它们的更新值用于另一个函数中的其他计算(位于另一个文件和类中)。这两个函数都将这些变量作为参数。
  • 不要说“函数”和“变量”,而是尝试更多地说明它们是什么,除非您正在开发的内容是机密的。此外,您当前的代码对我来说意义不大。试着解释一下。
  • 不能直接改Main1.value1吗?
  • 你的意思是不使用字典?我的示例是逻辑的简化版本,但我的真实函数在多个字典中有 +10 个变量,我需要能够避免使用单个 static var variables 并让所有内容都通过函数中的单个对象进行传输。也许上传我的实际代码会更有意义,但我害怕让所有人震惊

标签: swift variables dictionary logic


【解决方案1】:

根据评论进行编辑

根据下面的 cmets,这是一个潜在的解决方案:

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
    }
}

原始答案

Swift 中,[String : Int]StringIntvalue types,而不是它们的 Objective-C 对应物 NSDictionaryNSStringNSNumber,后者是reference types

这意味着当您执行guard var value = dict1 else { return } 时,value 现在是字典所包含内容的副本,而不是对字典中那条数据的引用。

所以当您执行value = value + 1 时,您设置的是新变量值,而不是字典的内容。

按照您的逻辑,您需要将value 放回字典中,如下所示:

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
}

【讨论】:

  • 哇,这是否意味着 "Main1.value1" reference 会被更改?否则将使用NSDictionary 作为解决方案。事实上,这正是我想要做的:更新reference value,同时通过方便的字典访问它!非常感谢贝尔!
  • 正如我所提到的,Main1.value1 不是参考。这是一个价值。所以它确实会改变,因此你需要将它设置为 var 而不是 letlet 是一个常量,根据定义不能改变)。很酷的部分是 Swift 会更改值并将其重新分配给 Main1.value1。不用担心。
  • print(Main1.value1)dict[value] = intValue 之后仍然打印 1。我确信 dictionary 内的值已更改,但我正在尝试更新 static var value1 : Int = 1 以在其他地方使用。事实上,我正在尝试做Main1.value1 = Main1.value1 + 1,但是在通过字典访问Main1.value1 时,这是不可能的,因为我没有在此处访问参考。如何使用 dictionaryNSDictionary 访问参考?
  • 考虑到dict 在方法返回后会消失,函数有点多余。有什么特殊原因不能直接设置static var value1
  • 您更新的答案正是我需要的贝尔!非常非常感谢!
猜你喜欢
  • 2023-03-28
  • 2010-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
相关资源
最近更新 更多