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

时间:2019-03-11 13:30:09

标签: arrays swift

我正在寻找比较用户输入的字符串值并将其与适当的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")

}
}

3 个答案:

答案 0 :(得分:3)

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

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来实现,但它们并不是解决此问题的正确方法。

答案 1 :(得分:1)

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

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 }

答案 2 :(得分:1)

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

    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")

        }
    }
相关问题