iOS之Scanner基本用法

iOS之Scanner字符串扫描类

注: 本文主要语法为Swift4.0

  • Scanner继承自NSObject,遵守NSCopying协议。是一个用于扫描指定字符串的抽象类

  • 可以创建Scanner时制定他的String属性,然后scanner会按照你的要求从头到尾扫描这个字符串的每个字符

  • 扫描操作从上次扫描的位置开始,并且继续往后扫描直到指定的内容出现为止(如果有的话)

1. 部分属性的相关解释

 open var string: String { get }
 // (只读)返回当前被扫描的字符串

open var scanLocation: Int
// 当前扫描的位置,默认是从0开始的。通过设置这个属性值,可以自定义扫描的位置

open var charactersToBeSkipped: CharacterSet?
// 这个集合是用来设置我们需要跳过扫描的一个字符集合

open var caseSensitive: Bool
// 是否大小写敏感

    
public init(string: String)
// 用给定扫描字符串初始化

2. 部分方法的相关解释

2-1 以下方法的作用都是

  • 扫描该类型的字符串,并将扫描结果赋值给result
  • 判断该字符串的第一个字符(默认第一个,可根据scanLocation属性设置)是否为该类型

    open func scanInt32(_ result: UnsafeMutablePointer<Int32>?) -> Bool

    @available(iOS 2.0, *)
    open func scanInt(_ result: UnsafeMutablePointer<Int>?) -> Bool

    open func scanInt64(_ result: UnsafeMutablePointer<Int64>?) -> Bool

    @available(iOS 7.0, *)
    open func scanUnsignedLongLong(_ result: UnsafeMutablePointer<UInt64>?) -> Bool

    open func scanFloat(_ result: UnsafeMutablePointer<Float>?) -> Bool

    open func scanDouble(_ result: UnsafeMutablePointer<Double>?) -> Bool

2-1-1 包含纯数字的字符串

var int1: Int = 0
var int64: Int64 = 0
var int32: Int32 = 0
var float1: Float = 0.0
var double1: Double = 0.0
//判断字符串包含的类型(输出结果为true)
print(Scanner(string: "987").scanInt(&int1))
print(Scanner(string: "897").scanInt64(&int64))
print(Scanner(string: "99").scanInt32(&int32))
print(Scanner(string: "90.99").scanFloat(&float1))
print(Scanner(string: "98.09").scanDouble(&double1))
//输出扫描后的结果
int1 = 98
int64 = 897
int32 = 99
float = 90.99
double = 98.09

2-1-2 非纯数字的字符串

var int1: Int = 0
let scanner = Scanner(string: "m998k23l")
scanner.scanLocation = 1
print(scanner.scanInt(&int1)) // true
//int1 = 998

var double1: Double = 0.0
let scanner = Scanner(string: "ms9.98k45l")
scanner.scanLocation = 1
print(scanner.scanDouble(&double1)) false
//double1 = 0.0

2-2 以下方法的作用都是

  • 扫描字符串前缀是否是"0x"或者"0X",返回true或false
  • 将0x(0X)字符后面符合十六进制数的字符串转化成十进制数(可运用到UIColor关于十六进制数的转化)
    open func scanHexInt32(_ result: UnsafeMutablePointer<UInt32>?) -> Bool // Optionally prefixed with "0x" or "0X"

    @available(iOS 2.0, *)
    open func scanHexInt64(_ result: UnsafeMutablePointer<UInt64>?) -> Bool // Optionally prefixed with "0x" or "0X"

    @available(iOS 2.0, *)
    open func scanHexFloat(_ result: UnsafeMutablePointer<Float>?) -> Bool // Corresponding to %a or %A formatting. Requires "0x" or "0X" prefix.

    @available(iOS 2.0, *)
    open func scanHexDouble(_ result: UnsafeMutablePointer<Double>?) -> Bool // Corresponding to %a or %A formatting. Requires "0x" or "0X" prefix.

2-2-1 代码示例

print(Scanner(string: "xdd").scanHexInt64(&uint64))  //false
print(Scanner(string: "0xdd").scanHexInt64(&uint64))  //true
print(uint64) //221
print(Scanner(string: "0xax").scanHexInt32(&uint32))  //true
print(uint32)  // 10
print(Scanner(string: "0X991").scanHexFloat(&float1))  //true
print(float1)  //2449.0
print(Scanner(string: "0X99").scanHexDouble(&double1))  //true
print(double1)  //153.0

2-3 从给定的字符串中找到相同的字符

open func scanString(_ string: String, into result: AutoreleasingUnsafeMutablePointer<NSString?>?) -> Bool

代码示例

var sstring: NSString?
let scan = Scanner(string: "32jingki")
while !scan.isAtEnd{ // 判断是否扫描到最后
    scan.scanLocation += 1
    print(scan.scanLocation)
    scan.scanString("i", into: &sstring)
    print(sstring)
}

2-4 Scanner的其他方法

open func scanCharacters(from set: CharacterSet, into result: AutoreleasingUnsafeMutablePointer<NSString?>?) -> Bool
////从scan中扫描出string放入result中,如果不需要存储string,则result传NULL


open func scanUpTo(_ string: String, into result: AutoreleasingUnsafeMutablePointer<NSString?>?) -> Bool
//从scan中扫描出string之外的数据放入result中,如果不需要存储string,则result传NULL


open func scanUpToCharacters(from set: CharacterSet, into result: AutoreleasingUnsafeMutablePointer<NSString?>?) -> Bool
//从scan中扫描出set之外的数据放入result中,如果不需要存储string,则result传NULL

2-5 关于使用Scanner处理UIColor十六进制数值的问题

  • 可在UIColor的extension中添加扩展方法
    /** 十六进制颜色扩充
     */
    convenience init?(hex : String, alpha : CGFloat = 1.0) {
        //1.判断字符串长度是否符合
        guard hex.characters.count >= 6 else {
            return nil
        }
        //2.将字符串转成大写
        var tempHex = hex.uppercased()
        //3.判断开头
        if tempHex.hasPrefix("0x") || tempHex.hasPrefix("##") || tempHex.hasPrefix("0X") {
            //去掉开头
            tempHex = tempHex.dropFirst(2)
        }
        if tempHex.hasPrefix("#") {
            tempHex = tempHex.dropFirst()
        }
        //4.分别截取RGB
        var range = NSRange(location: 0, length: 2)
        let rHex = (tempHex as NSString).substring(with: range)
        range.location = 2
        let gHex = (tempHex as NSString).substring(with: range)
        range.location = 4
        let bHex = (tempHex as NSString).substring(with: range)
        //5.将字符串转化成数字  emoji也是十六进制表示(此处也可用Float类型)
        var r : UInt32 = 0, g : UInt32 = 0, b : UInt32 = 0
        //创建扫描器,将字符串的扫描结果赋值给:r,g,b
        Scanner(string: rHex).scanHexInt32(&r)
        Scanner(string: gHex).scanHexInt32(&g)
        Scanner(string: bHex).scanHexInt32(&b)
        
        self.init(r : CGFloat(r), g : CGFloat(g), b : CGFloat(b))
    }


    /**RGB三原色
     */
    convenience init(r : CGFloat, g : CGFloat, b : CGFloat, alpha : CGFloat = 1.0) {
        self.init(red: r / 255.0, green: g / 255.0, blue: b / 255.0, alpha: alpha)
    }

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,233评论 6 495
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,357评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,831评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,313评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,417评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,470评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,482评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,265评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,708评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,997评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,176评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,827评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,503评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,150评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,391评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,034评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,063评论 2 352

推荐阅读更多精彩内容