【问题标题】:XCode/Swfit: How do I switch out a variable passed between view controllers as the name for a dictionary?XCode/Swift:如何切换视图控制器之间传递的变量作为字典的名称?
【发布时间】:2021-08-06 00:39:42
【问题描述】:

我在 XCode 12/Swift 5 中使用以下代码来尝试执行以下操作:

  1. 接收一个从一个视图控制器传递给这个视图控制器的变量(passedVerb,这可行)

  2. 根据传递的“passedVerb”变量在字典中查找项目。这将根据用户在主视图控制器中使用的动词而改变,因此我需要它能够将其切换出去。

  3. 当我在操场上运行以下代码时,它运行良好

    import UIKit
    
    
    var yekol = [0: "yekol",
                 1: "bekol",
                 2: "btekol"]
    
    
    var youm = [0: "youm",
                1: "boum",
                2: "btoum"]
    
    
    var yekol2 = ["inf": "yekol",
                 "ana": "bekol",
                 "enta": "btekol"]
    
    
    var verbs = [yekol, youm]
    var randVerb = verbs.randomElement()
    
    //depending on which random verb is chosen, look up in the right dictionary above
    var anaForm = randVerb![1]!
    var entaForm = randVerb![2]!
    
    print(anaForm as Any)
    print(entaForm as Any)
    

但是当我尝试在主项目的视图控制器中执行此操作时,我无法像使用“randVerb”在正确的字典中查找一样使用“passedVerb”:

import UIKit

class AboutViewController: UIViewController {
    
    //variables
    var anaForm = ""
    var entaForm = ""
    var nehnaForm = ""
    
    //a variable to hold the data from the first ViewController
    var passedVerb = ""
    
    let yekol = [0: "yekol",
                 1: "bekol",
                 2: "btekol",
                 3: "mnekol"]


    let edros = [0: "edros",
                1: "bedros",
                2: "btedros",
                3: "mnedros"]
    
    
    func updateTable() {
        
        //below works, but only because I'm explicitly calling the right dictionary
        var anaForm = yekol[1] 

        //neither of the below forms work in the same way as in playground. i get a 'subscript(_:)' is unavailable: cannot subscript String with an Int, use a String.Index instead. i can't for the life of me figure out how to fix this despite the warning
        var entaForm = passedVerb![2]! 
        var nehnaForm = passedVerb[3]

        anaLabel.text = anaForm
        entaLabel.text = entaForm
        nehnaLabel.text = nehnaForm
    }

    }

    
    @IBOutlet weak var currentVerb: UILabel!
    @IBOutlet weak var anaLabel: UILabel!
    @IBOutlet weak var entaLabel: UILabel!
    @IBOutlet weak var nehnaLabel: UILabel!
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        currentVerb.text = passedVerb
        updateTable()
    }
}

任何见解或帮助将不胜感激。我一直在学习 Xcode/Swift 作为我的第一门编码语言,所以希望这不是(也许是?)太明显的问题。

提前致谢!

【问题讨论】:

  • “接收一个从一个视图控制器传递给这个视图控制器的变量(passedVerb,这有效)”你所谓的“一个视图控制器”在哪里?
  • 你如何在另一个视图控制器中调用“updateTable”?
  • 嗨!当第二个视图控制器加载时,我只是调用函数“updateTable”,以便第二个视图控制器中的标签显示正确的形式。第一个视图控制器非常基本,而我对此进行测试:只需使用按钮点击将字符串变量传递给第二个: //动词范式备忘单 @IBAction func didTapButton() { let vc = storyboard?.instantiateViewController(identifier: “about_vc”)为! AboutViewController vc.passedVerb = infVerb present(vc, animated: true) }
  • (抱歉,如果这不是正确的回应方式。对此不熟悉。)
  • “当第二个视图控制器加载时”向我们展示如何而不是告诉我们何时。

标签: swift xcode dictionary replace lookup


【解决方案1】:

您可能正在尝试传递 [Int : String]?通过动词。但是您在 AboutViewController 中将 var passVerb = "" 声明为字符串。 所以 AboutViewController 中的代码试图找到一个字符串的索引,这是你做不到的。 因此,您收到错误消息。尝试像这样声明“passedVerb”:

var passedVerb: [Int : String]? = [:]

并像这样使用它:

            var entaForm = ""
            if let vb = passedVerb?[2] {
                entaForm = vb
            }

同样适用于“nehnaForm”。

【讨论】:

  • 谢谢!当我有时间时会对此进行破解。
【解决方案2】:

如果您需要帮助将包含多个动词形式的字典从一个视图控制器传递到下一个视图控制器,您需要发布将动词传递给另一个视图控制器的当前代码。

您是否使用 segue 和 prepare(for:sender:)?添加调用第二个视图控制器并传递动词的代码。

我注意到一件事:在 AboutViewController 中,您将 passedVerb 声明为空的 String。但是,在您的 Playground 代码中,您的动词是 [Int:String] 类型(带有 Int 键和 String 值的字典。

您应该将passedVerb 的声明更改为:

var passedVerb = [Int:String]()

编辑:

这就是您收到错误消息的原因:

subscript(_:)' 不可用:不能用 Int 为 String 下标,请改用 String.Index。

您将passedVerb 声明为字符串,然后尝试将其作为字典进行索引。

您还应该停止使用! 强制展开运算符。如果字典不包含指定的键,这些将使您的代码崩溃。

【讨论】:

  • 谢谢你,邓肯!这里很新,所以努力让我明白这一点。等我回家后我会发布第一个视图控制器。
猜你喜欢
  • 1970-01-01
  • 2012-04-20
  • 1970-01-01
  • 1970-01-01
  • 2012-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多