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>]]