繁体   English   中英

Swift:如何正确比较字符串值和多个值

[英]Swift: How to correctly compare String value to multiple values

我正在寻找比较用户输入的字符串值并将其与适当的Stage和Level值进行比较的最佳方法。

截至目前,我已经做了很多像这样的数组

let Stage1Level1 = ["Phone","Computer,Television"]
let Stage1Level2 = ["Horse","Shoe"]
let Stage1Level3 = ["Milk"]

let Stage2Level1 = ["Snow","Sun"]
let Stage2Level2 = ["Smile","Cry","Water","Salt"]
let Stage2Level3 = ["Five"]

等等...

因此,不是在寻找一个长的if语句来检查用户输入的Stage和Level,而是在寻找最有效的方法。

像这样:

var currentStage = 1
var currentLogo = 2

@IBAction func textFieldChanged(_ sender: Any) {

if textFieldChangedOut.text? == Stage(currentStage)Level(currentLogo){

print("Contains the value")

}
}

目前尚不清楚这些字符串是什么,但这绝对是错误的数据结构。 我怀疑您正在寻找这样的东西,一个阶段数组,每个阶段包含一个级别数组,每个级别包含一个字符串数组。

struct Level {
    var values: [String]
}

struct Stage {
    var levels: [Level]
}

let stages = [
    Stage(levels: [
        Level(values: ["One", "Two"])
        Level(values: ["Horse", "Shoe"]),
        Level(values: ["One", "Two"]),
        ]),
    Stage(levels: [
        Level(values: ["Snow", "Sun"]),
        Level(values: ["Smile", "Cry"]),
        Level(values: ["Five", "Six"]),
        ]),
]

var currentStage = 1
var currentLogo = 2

// Remember that arrays are 0-indexed. If "currentStage" is 1-indexed
// you need to adjust it
let level = stages[currentStage - 1].levels[currentLogo - 1]
let words = level.values

if let text = textFieldChangedOut.text, words.contains(text) {
    print("Contains the value")
}

在纯Swift中,要动态地计算变量名是不可能的。 有几种方法可以通过桥接到ObjC来实现,但是它们不是解决此问题的正确方法。

我会创建一个舞台,关卡和字符串的结构,并具有该结构的数组

struct StageLevel {
    let stage: Int
    let level: Int
    let words: [String]
}

let stageLevelArray: [StageLevel] = 
    [StageLevel(stage: 1, level: 1, words: ["Hello", "Hi"]), 
    StageLevel(stage: 1, level: 2, words: ["Red", "Blue", "Green"]), 
    StageLevel(stage: 2, level: 1, words: ["No", "Yes"])]

然后您可以筛选出选定阶段的所有元素

let levels = stageLevelArray.filter( { $0.stage == 1} )

或筛选出一个阶段和一个级别

let selection = stageLevelArray.filter( { $0.stage == 1 && $0.level == 2 } )

或者如果您只想要关卡或数组

let levels = stageLevelArray.filter( { $0.stage == 1} ).map { $0.level}
let selection = stageLevelArray.filter( { $0.stage == 1 && $0.level == 2 } ).map { $0.words }

也许您可以理解在当前数据中添加字典。

    let Stage1Level1 = ["Phone","Computer,Television"]
    let Stage1Level2 = ["Horse","Shoe"]
    let Stage1Level3 = ["Milk"]

    let Stage2Level1 = ["Snow","Sun"]
    let Stage2Level2 = ["Smile","Cry","Water","Salt"]
    let Stage2Level3 = ["Five"]


    var currentStage = 1
    var currentLogo = 2

    var stageDict : [String: [String]] = [:]


    stageDict["Stage1Level1"] = Stage1Level1
    stageDict["Stage1Level2"] = Stage1Level2
    stageDict["Stage1Level3"] = Stage1Level3
    stageDict["Stage2Level1"] = Stage2Level1
    stageDict["Stage2Level2"] = Stage2Level2
    stageDict["Stage2Level3"] = Stage2Level3


  //You also can build by this way

   [[Stage1Level1, Stage1Level2, Stage1Level3], [Stage2Level1, Stage2Level2,Stage2Level3]]

   .enumerated().forEach{ stage in stage.element.enumerated().forEach{
    stageDict["Stage\(stage.offset+1)Level\($0.offset+1)"] = $0.element
    }
    }

    @IBAction func textFieldChanged(_ sender: Any) {

    if  stageDict["Stage\(currentStage)Level\(currentLogo)"]!.contains(textFieldChangedOut.text!) {
            print("Contains the value")

        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM