Ios swift中射程问题的三维数组

Ios swift中射程问题的三维数组,ios,swift,xcode,compilation,Ios,Swift,Xcode,Compilation,我有一个范围表,基本上,我想从中找到我的分数。我的桌子看起来像 我的代码如下所示: let ageForRhr = [18...25,26...35,36...45,46...55,56...65,65...100] let menRhrScore = [ [49...55 , 56...61,62...65,66...69,70...73,74...81,82...200], [49...54 , 55...61,62...65,66...70

我有一个范围表,基本上,我想从中找到我的分数。我的桌子看起来像

我的代码如下所示:

let ageForRhr = [18...25,26...35,36...45,46...55,56...65,65...100]

    let menRhrScore = [ [49...55 , 56...61,62...65,66...69,70...73,74...81,82...200],
                    [49...54 , 55...61,62...65,66...70,71...74,75...81,82...200],
                    [50...56 , 57...62,63...66,67...70,71...75,76...82,83...200],
                    [50...57 , 58...63,64...67,68...71,72...76,77...83,84...200],
                    [51...56 , 57...61,62...67,68...71,72...75,76...81,82...200],
                    [50...55 , 56...61,62...65,66...69,70...73,74...79,80...200]]

    let womenRhrScore = [ [54...60 , 61...65,66...69,70...73,74...78,79...84,85...200],
                          [54...59 , 60...64,65...68,69...72,73...76,77...82,83...200],
                          [54...59 , 60...64,65...69,70...73,74...78,79...84,85...200],
                          [54...60 , 61...65,66...69,70...73,74...77,78...83,84...200],
                          [54...59 , 60...64,65...68,69...73,74...77,78...83,84...200],
                          [54...59 , 60...64,65...68,69...72,73...77,78...84,85...200]]
    func getRhrStatusFromScore (score : Int, age : Int , isMale : Bool) -> String
    {
        for index in ageForRhr.indices
        {
            if  let arr  = ageForRhr[index]
            {
                if arr.contains(age)
                {
                    if let arrVO2 = isMale ? menRhrScore[index] : womenRhrScore[index]
                    {
                        for indSub in arrVO2.indices
                        {
                            if let subArr = arrVO2[indSub]
                            {
                                if subArr.contains(score)
                                {
                                    if let activity = rhrStatus(rawValue: indSub)
                                    {
                                        return activity.getValue()
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        return ""
    }
    enum rhrStatus : Int
    {
    case poor           = 6
    case belowAve       = 5
    case average        = 4
    case aboveAve       = 3
    case good           = 2
    case excellent      = 1
    case athlete        = 0
   }
但不幸的是,swift编译器在编译上述代码时卡住了。(没有给出任何错误或警告,只是坚持编译swift文件。如果我对上面的代码进行注释,它很容易编译。)请建议一种更好的方法


提前谢谢。

您的代码看起来像是一团乱麻,有这么多不同的数组。定义适当的数据模型,如下所示:

struct HeartRateStatus {
    enum Gender {
        case male
        case female
    }

    enum Status: String {
        case athlete
        case excellent
        case good
        case aboveAverage
        case average
        case belowAverage
        case poor
        case unknown
    }

    var gender: Gender
    var status: Status
    var ageRange: ClosedRange<Int>
    var scoreRange: ClosedRange<Int>
}
现在,您的
getRhrStatus
函数变得清晰简洁:

func getRhrStatus(score: Int, age: Int, gender: HeartRateStatus.Gender) -> HeartRateStatus.Status {
    let result = rhrLookup.first {
        $0.scoreRange.contains(score) && $0.ageRange.contains(age) && $0.gender == gender
    }

    return result?.status ?? .unknown
}
测试:


显然,这不会检查重叠的范围,但如果找不到分数,它将返回一个
未知的
状态。

当您没有明确指定文本的类型时,Swift编译器在编译大型数组文本时会遇到问题。它超越了斯威夫特的类型推断系统,需要很长时间,或者永远不会完成

在这种情况下,似乎有必要为数组本身和各个组件提供显式类型

这些更改将允许您的数组编译:

let ageForRhr: [CountableClosedRange<Int>] = [18...25,26...35,36...45,46...55,56...65,65...100]

let menRhrScore: [[CountableClosedRange<Int>]] = [ [49...55 , 56...61,62...65,66...69,70...73,74...81,82...200] as [CountableClosedRange<Int>],
                [49...54 , 55...61,62...65,66...70,71...74,75...81,82...200] as [CountableClosedRange<Int>],
                [50...56 , 57...62,63...66,67...70,71...75,76...82,83...200] as [CountableClosedRange<Int>],
                [50...57 , 58...63,64...67,68...71,72...76,77...83,84...200] as [CountableClosedRange<Int>],
                [51...56 , 57...61,62...67,68...71,72...75,76...81,82...200] as [CountableClosedRange<Int>],
                [50...55 , 56...61,62...65,66...69,70...73,74...79,80...200] as [CountableClosedRange<Int>]]

let womenRhrScore: [[CountableClosedRange<Int>]] = [ [54...60 , 61...65,66...69,70...73,74...78,79...84,85...200] as [CountableClosedRange<Int>],
                      [54...59 , 60...64,65...68,69...72,73...76,77...82,83...200] as [CountableClosedRange<Int>],
                      [54...59 , 60...64,65...69,70...73,74...78,79...84,85...200] as [CountableClosedRange<Int>],
                      [54...60 , 61...65,66...69,70...73,74...77,78...83,84...200] as [CountableClosedRange<Int>],
                      [54...59 , 60...64,65...68,69...73,74...77,78...83,84...200] as [CountableClosedRange<Int>],
                      [54...59 , 60...64,65...68,69...72,73...77,78...84,85...200] as [CountableClosedRange<Int>]]
let ageForRhr:[CountableClosedRange]=[18…25,26…35,36…45,46…55,56…65,65…100]
让menRhrScore:[[CountableClosedRange]]=[49…55,56…61,62…65,66…69,70…73,74…81,82…200]作为[CountableClosedRange],
[49…54,55…61,62…65,66…70,71…74,75…81,82…200]作为[CountableClosedRange],
[50…56,57…62,63…66,67…70,71…75,76…82,83…200]作为[CountableClosedRange],
[50…57,58…63,64…67,68…71,72…76,77…83,84…200]作为[CountableClosedRange],
[51…56,57…61,62…67,68…71,72…75,76…81,82…200]作为[CountableClosedRange],
[50…55,56…61,62…65,66…69,70…73,74…79,80…200]作为[CountableClosedRange]]
让女性得分:[[CountableClosedRange]]=[54…60,61…65,66…69,70…73,74…78,79…84,85…200]为[CountableClosedRange],
[54…59,60…64,65…68,69…72,73…76,77…82,83…200]作为[CountableClosedRange],
[54…59,60…64,65…69,70…73,74…78,79…84,85…200]作为[CountableClosedRange],
[54…60,61…65,66…69,70…73,74…77,78…83,84…200]作为[CountableClosedRange],
[54…59,60…64,65…68,69…73,74…77,78…83,84…200]作为[CountableClosedRange],
[54…59,60…64,65…68,69…72,73…77,78…84,85…200]作为[CountableClosedRange]]
您的代码有编译错误,现在Swift已解除锁定,您可以查看并修复这些错误

let status = getRhrStatus(score: 50, age: 20, gender: .male)
print(status)
let ageForRhr: [CountableClosedRange<Int>] = [18...25,26...35,36...45,46...55,56...65,65...100]

let menRhrScore: [[CountableClosedRange<Int>]] = [ [49...55 , 56...61,62...65,66...69,70...73,74...81,82...200] as [CountableClosedRange<Int>],
                [49...54 , 55...61,62...65,66...70,71...74,75...81,82...200] as [CountableClosedRange<Int>],
                [50...56 , 57...62,63...66,67...70,71...75,76...82,83...200] as [CountableClosedRange<Int>],
                [50...57 , 58...63,64...67,68...71,72...76,77...83,84...200] as [CountableClosedRange<Int>],
                [51...56 , 57...61,62...67,68...71,72...75,76...81,82...200] as [CountableClosedRange<Int>],
                [50...55 , 56...61,62...65,66...69,70...73,74...79,80...200] as [CountableClosedRange<Int>]]

let womenRhrScore: [[CountableClosedRange<Int>]] = [ [54...60 , 61...65,66...69,70...73,74...78,79...84,85...200] as [CountableClosedRange<Int>],
                      [54...59 , 60...64,65...68,69...72,73...76,77...82,83...200] as [CountableClosedRange<Int>],
                      [54...59 , 60...64,65...69,70...73,74...78,79...84,85...200] as [CountableClosedRange<Int>],
                      [54...60 , 61...65,66...69,70...73,74...77,78...83,84...200] as [CountableClosedRange<Int>],
                      [54...59 , 60...64,65...68,69...73,74...77,78...83,84...200] as [CountableClosedRange<Int>],
                      [54...59 , 60...64,65...68,69...72,73...77,78...84,85...200] as [CountableClosedRange<Int>]]