Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Swift:如何从NSString数组中获取最后一个整数?_Ios_Arrays_Swift - Fatal编程技术网

Ios Swift:如何从NSString数组中获取最后一个整数?

Ios Swift:如何从NSString数组中获取最后一个整数?,ios,arrays,swift,Ios,Arrays,Swift,使用Swift,我从一个网站以NSString的形式获取AQI(空气质量指数)数据。AQI1到AQI6基本上是每小时的AQI数据(例如,上午12点到5点,但实际代码中的AQI24)。“#”表示数据尚不可用。整数是AQI,有时可能会有“a”/“b”表示的与整数相关的额外信息,这些整数表示“存在一氧化碳”/“存在二氧化硫”。我想做的是: 1) 显示arrAQI中的最后一个整数(不包括“#”,不在LabelAQI上显示“a”/“b”,即“88”) 2) 如果arrAQI中最后一个整数为“a”/“b”,

使用Swift,我从一个网站以NSString的形式获取AQI(空气质量指数)数据。AQI1到AQI6基本上是每小时的AQI数据(例如,上午12点到5点,但实际代码中的AQI24)。“#”表示数据尚不可用。整数是AQI,有时可能会有“a”/“b”表示的与整数相关的额外信息,这些整数表示“存在一氧化碳”/“存在二氧化硫”。我想做的是:

1) 显示arrAQI中的最后一个整数(不包括“#”,不在LabelAQI上显示“a”/“b”,即“88”)

2) 如果arrAQI中最后一个整数为“a”/“b”,则在LabelExtraInfo上显示“存在一氧化碳”/“存在二氧化硫”;如果没有,则保留LabelExtraInfo.text=“-”


我刚开始编程几个星期。有人能帮忙吗?有没有更好的方法来做我想做的事?提前非常感谢。

使用正则表达式,您可以轻松地从字符串中提取数字。您可能希望按照以下思路做一些事情:

var LabelAQI = "-"
var LabelExtraInfo = "-"

var arrAQI = [NSString]()

var AQI1:NSString = "55a"
var AQI2:NSString = "95a"
var AQI3:NSString = "66"
var AQI4:NSString = "25"
var AQI5:NSString = "88b"
var AQI6:NSString = "#"

arrAQI[0...5] = [AQI1, AQI2, AQI3, AQI4, AQI5, AQI6]

这将获取字符串并删除所有字母字符,只留下数字。然后,您可以根据需要将字符串转换为整数

有很多方法可以做到这一点,下面是使用NSScanner的一个建议:

let regex = NSRegularExpression(pattern: "[\a-z\s]", options: nil, error: nil)
let aq1value = regex?.stringByReplacingMatchesInString(arrAQI[0], options: nil, range: NSMakeRange(0, count(arrAQI[0])), withTemplate: "")
首先,我反转数组并循环遍历它以获得最后一个非散列符号条目。然后使用NSCharacterSet搜索,首先扫描字符串中的数字,然后扫描字母a/b。一旦找到了,我们就可以打破循环,一切都完成了


注意:这行代码
arrAQI[0…5]=[AQI1,AQI2,AQI3,AQI4,AQI5,AQI6]
不起作用,所以我用
arrAQI.extend([AQI1,AQI2,AQI3,AQI4,AQI5,AQI6])
它通常有助于将问题分解为多个函数。在这里,您需要做两件事——处理字符串、提取数字和可能的额外信息。然后,在字符串数组上循环,直到找到合适的条目

首先是字符串处理。给定一个字符串,您希望返回一对(读取和额外信息)或“未找到”。无论何时您需要返回某个内容或未找到,可选的都是一个不错的选择。因此,您需要一个接受字符串并返回可选
(Int,string)
对的函数:

var LabelAQI = "-"
var LabelExtraInfo = "-"

var arrAQI = [NSString]()

let AQI1:NSString = "55a", AQI2 = "95a", AQI3 = "66", AQI4 = "25", AQI5 = "88b", AQI6 = "#"    
arrAQI.extend([AQI1, AQI2, AQI3, AQI4, AQI5, AQI6])

for AQI in reverse(arrAQI) {
    if AQI != "#" {
        var str:NSString?

        let numberSet = NSCharacterSet.decimalDigitCharacterSet()    
        let letterSet = NSCharacterSet(charactersInString: "ab")

        let scanner = NSScanner(string: AQI as String)
        if scanner.scanCharactersFromSet(numberSet, intoString:&str) {
            LabelAQI = str as! String
            if scanner.scanCharactersFromSet(letterSet, intoString: &str) {
                switch str as! String {
                case "a":
                        LabelExtraInfo = "Carbon Monoxide present"

                case "b":
                        LabelExtraInfo = "Sulphur Dioxide present"

                default:
                    break
                }
            }
            break
        }

    }
}

LabelAQI // "88"
LabelExtraInfo // "Sulphur Dioxide present"
但您可以更进一步,定义一个枚举来表示额外信息的不同位:

func extractData(input: String) -> (Int,String)?
这样,所有讨厌的字符串处理都包含在
extractData

在该函数中,您需要检查已知的尾随字符,然后去掉该字符,如果剩下的是一个数字,则返回两个值。但如果剩下的不是数字,则返回nil:

enum AirQualityInfo {
    case CarbonMonoxide,
         SulphurDioxide,
         NoInfo
}

func extractData(input: String) -> (Int,AirQualityInfo)?
正如其他人所建议的那样,您可以使用正则表达式来实现这一点,但我个人认为,考虑到您的数据解析需求非常具体,这样做太过分了

使用此函数后,可以按相反顺序循环数组,使用函数检查每个值,直到找到有效值:

func extractData(input: String) -> (Int,AirQualityInfo)? {

    let stripped: String
    let extraInfo: AirQualityInfo

    switch last(input) {
    case .Some("a"):
        stripped = dropLast(input)
        extraInfo = .CarbonMonoxide
    case .Some("b"):
        stripped = dropLast(input)
        extraInfo = .SulphurDioxide
    default:
        stripped = input
        extraInfo = .NoInfo
    }

    return stripped.toInt().map { ($0,extraInfo) }
}
您还可以进一步考虑字符串的转换:

for idx in reverse(indices(arrAQI)) {
    if let (index, extraInfo) = extractData(arrAQI[idx]) {
        LabelAQI = toString(index)
        switch extraInfo {
        case .CarbonMonoxide:
            LabelExtraInfo = "Carbon Monoxide Present"
        case .SulphurDioxide:
            LabelExtraInfo = "SulphurDioxide Present"
        case .NoInfo:
            LabelExtraInfo = "-"
        }
        // stop going around the loop
        break
    }
}
最后,如果您觉得非常有冒险精神,可以编写一个函数,一次完成查找和映射操作:

extension AirQualityInfo {
    var displayString: String {
            switch self {
            case .CarbonMonoxide:
                return "Carbon Monoxide Present"
            case .SulphurDioxide:
                return "SulphurDioxide Present"
            case .NoInfo:
                return "-"
        }
    }
}

for idx in reverse(indices(arrAQI)) {
    if let (index, extraInfo) = extractData(arrAQI[idx]) {
       LabelAQI = toString(index)
       LabelExtraInfo = extraInfo.displayString
       break
    }
}

这可以通过将字符串分解为对象数组,然后检查每个对象来实现:

let AQI1 = "55a"
let AQI2 = "95a"
let AQI3 = "66"
let AQI4 = "25"
let AQI5 = "88b"
let AQI6 = "#"

let arrAQI = [AQI1,AQI2,AQI3,AQI4,AQI5,AQI6,]
更新

要查找最后一个没有“#”后缀的对象,可以使用以下代码:

var LabelAQI = "-"
var LabelExtraInfo = "-"

var stringFromServer = "55a 95a 66 25 88b #"

var objectsSeparated = stringFromServer.componentsSeparatedByString(" ")

for object in objectsSeparated
{
    if object.hasSuffix("a")
    {
        LabelAQI = object.substringToIndex(object.endIndex.predecessor())
        LabelExtraInfo = "Carbon Monoxide present"
    }
    else if object.hasSuffix("b")
    {
        LabelAQI = object.substringToIndex(object.endIndex.predecessor())
        LabelExtraInfo = "Sulphur Dioxide present"
    }
    else if object.hasSuffix("#")
    {
        LabelAQI = object.substringToIndex(object.endIndex.predecessor())
        LabelExtraInfo = "-"
    }
    else
    {
        LabelAQI = object
        LabelExtraInfo = "-"
    }
}

研究使用regex谢谢!但是如何只检查最后一个“非散列”对象?objectsSeparated数组必须是.hasSuffix的特定数组类型(例如String/NSString)才能工作?hasSuffix在数组内的对象上执行-因此,集合是什么并不重要,只要是“object”里面是String/NSString value。你能解释一下为什么使用String优于NSString吗?
var LabelAQI = "-"
var LabelExtraInfo = "-"

var stringFromServer = "55a 95a 66 25 88b #"

var objectsSeparated = stringFromServer.componentsSeparatedByString(" ")

for object in objectsSeparated
{
    if object.hasSuffix("a")
    {
        LabelAQI = object.substringToIndex(object.endIndex.predecessor())
        LabelExtraInfo = "Carbon Monoxide present"
    }
    else if object.hasSuffix("b")
    {
        LabelAQI = object.substringToIndex(object.endIndex.predecessor())
        LabelExtraInfo = "Sulphur Dioxide present"
    }
    else if object.hasSuffix("#")
    {
        LabelAQI = object.substringToIndex(object.endIndex.predecessor())
        LabelExtraInfo = "-"
    }
    else
    {
        LabelAQI = object
        LabelExtraInfo = "-"
    }
}
var LabelAQI = "-"
var LabelExtraInfo = "-"

var stringFromServer = "55a 95a 66 25 88b #"

var objectsSeparated = stringFromServer.componentsSeparatedByString(" ")

var index = objectsSeparated.count

while 0 >= index
{
    var object = objectsSeparated[index]

    index--

    if object.hasSuffix("#")
    {
        //this object has '#' suffix -> skip it
        continue
    }
    else
    {
        //found non '#' object
        if object.hasSuffix("a")
        {
            LabelAQI = object.substringToIndex(object.endIndex.predecessor())
            LabelExtraInfo = "Carbon Monoxide present"
        }
        else if object.hasSuffix("b")
        {
            LabelAQI = object.substringToIndex(object.endIndex.predecessor())
            LabelExtraInfo = "Sulphur Dioxide present"
        }
        else
        {
            LabelAQI = object
            LabelExtraInfo = "-"
        }
        break
    }
}