Ios Swift:如何从NSString数组中获取最后一个整数?
使用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=“-”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”,
我刚开始编程几个星期。有人能帮忙吗?有没有更好的方法来做我想做的事?提前非常感谢。使用正则表达式,您可以轻松地从字符串中提取数字。您可能希望按照以下思路做一些事情:
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
}
}