Scanner
Scanner
继承自NSObject
, 遵循NSCopying
协议。是一个用于扫描指定字符串的抽象类
初始化时指定需要扫描的String
,可以设置需要跳过的字符集合
调用scan
方法,scanner
会按要求扫描出需要提取的字符串
一、初始化
let scanner: Scanner = Scanner(string: "http://www.baidu.com?type=value&age=18")
二、属性
// 初始化时输入的目标字符串,只读
let string: String = scanner.string
// 想要跳过的字符串集合
let characters: CharacterSet? = scanner.charactersToBeSkipped
// 例如:”?111.1=222&name=mo“,把`?&`作为`charactersToBeSkipped`,则会忽略`?&`
// 是否大小写敏感,默认false
let caseSensitive: Bool = scanner.caseSensitive
// scanner.locale 本地化,用在小数点分隔符上,一般不用指定
let isAtEnd: Bool = scanner.isAtEnd
// 字符串是否已经扫描完毕(如果都是charactersToBeSkipped则返回true)
// 扫描位置,iOS13已弃用
let scanLocation: Int = scanner.scanLocation
// 当前扫描位置
let currentIndex: String.Index = scanner.currentIndex
三、方法
let scanner: Scanner = Scanner(string: "?11*2.2*3.3*namemoyan&Tqqyycxcttage=18")
scanner.charactersToBeSkipped = CharacterSet(charactersIn: "?*&") // 指定需要过滤的字符集合
var intNum: Int = 0
scanner.scanInt(&intNum) // 还可以扫描 int32 int64 的数字
print(intNum) // 11
var float1: Float = 0.0
scanner.scanFloat(&float1) // 还可以扫描 Double 的数字
print(float1) // 2.2
let decimal: Decimal? = scanner.scanDecimal() // 扫描小数
print(decimal ?? " ") // 3.3
let str1: String? = scanner.scanString("name") // 扫描指定字符串
print(str1 ?? "") // name
// 扫描指定字符集
let str2: String? = scanner.scanCharacters(from: CharacterSet(charactersIn: "moxiaoyan"))
print(str2 ?? "") // moyan
// 扫描一个字符
let chart: Character? = scanner.scanCharacter()
print(chart ?? "") // T
// 扫描到指定字符串时停下,result是指定字符串前面的字符串
let str3: String? = scanner.scanUpToString("yy")
print(str3 ?? "") // qq
// 扫描到指定字符集合时停下,result是指定字符前面的字符串
let str4: String? = scanner.scanUpToCharacters(from: CharacterSet(charactersIn: "eag"))
print(str4 ?? "") // yycxctt
四、使用举例
let scanner: Scanner = Scanner(string: "http://www.baidu.com?name=momo&age=18")
let domain = scanner.scanUpToString("?")
print(domain) // http://www.baidu.com
scanner.scanCharacter()
var param: [String: String] = [:]
while !scanner.isAtEnd {
let type = scanner.scanUpToString("=")
scanner.scanCharacter()
let value = scanner.scanUpToString("&")
guard let type = type else {
break
}
param[type] = value
}
print(param) //["name": "momo", "&age": "18"]