首页 > 解决方案 > XCode/Swfit:如何切换视图控制器之间传递的变量作为字典的名称?

问题描述

我在 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 作为我的第一门编码语言,所以希望这不是(也许是?)太明显的问题。

提前致谢!

标签: swiftxcodedictionaryreplacelookup

解决方案


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

你在使用 segueprepare(for:sender:)吗?添加调用第二个视图控制器并传递动词的代码。

我注意到的一件事:在AboutViewController您声明passedVerb为 empty String。但是,在您的 Playground 代码中,您的动词属于类型(包含键和值[Int:String]的字典。IntString

您应该将声明更改passedVerb为:

var passedVerb = [Int:String]()

编辑:

这就是为什么你得到你得到的错误:

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

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

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


推荐阅读