-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathNSScanner+Swift.swift
154 lines (134 loc) · 4.25 KB
/
NSScanner+Swift.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
// NSScanner+Swift.swift
// A set of Swift-idiomatic methods for NSScanner
//
// (c) 2015 Nate Cook, licensed under the MIT license
import Foundation
extension NSScanner {
// MARK: Strings
/// Returns a string, scanned as long as characters from a given character set are encountered, or `nil` if none are found.
func scanCharactersFromSet(set: NSCharacterSet) -> String? {
var value: NSString? = ""
if scanCharactersFromSet(set, intoString: &value),
let value = value as? String {
return value
}
return nil
}
/// Returns a string, scanned until a character from a given character set are encountered, or the remainder of the scanner's string. Returns `nil` if the scanner is already `atEnd`.
func scanUpToCharactersFromSet(set: NSCharacterSet) -> String? {
var value: NSString? = ""
if scanUpToCharactersFromSet(set, intoString: &value),
let value = value as? String {
return value
}
return nil
}
/// Returns the given string if scanned, or `nil` if not found.
func scanString(str: String) -> String? {
var value: NSString? = ""
if scanString(str, intoString: &value),
let value = value as? String {
return value
}
return nil
}
/// Returns a string, scanned until the given string is found, or the remainder of the scanner's string. Returns `nil` if the scanner is already `atEnd`.
func scanUpToString(str: String) -> String? {
var value: NSString? = ""
if scanUpToString(str, intoString: &value),
let value = value as? String {
return value
}
return nil
}
// MARK: Numbers
/// Returns a Double if scanned, or `nil` if not found.
func scanDouble() -> Double? {
var value = 0.0
if scanDouble(&value) {
return value
}
return nil
}
/// Returns a Float if scanned, or `nil` if not found.
func scanFloat() -> Float? {
var value: Float = 0.0
if scanFloat(&value) {
return value
}
return nil
}
/// Returns an Int if scanned, or `nil` if not found.
func scanInteger() -> Int? {
var value = 0
if scanInteger(&value) {
return value
}
return nil
}
/// Returns an Int32 if scanned, or `nil` if not found.
func scanInt() -> Int32? {
var value: Int32 = 0
if scanInt(&value) {
return value
}
return nil
}
/// Returns an Int64 if scanned, or `nil` if not found.
func scanLongLong() -> Int64? {
var value: Int64 = 0
if scanLongLong(&value) {
return value
}
return nil
}
/// Returns a UInt64 if scanned, or `nil` if not found.
func scanUnsignedLongLong() -> UInt64? {
var value: UInt64 = 0
if scanUnsignedLongLong(&value) {
return value
}
return nil
}
/// Returns an NSDecimal if scanned, or `nil` if not found.
func scanDecimal() -> NSDecimal? {
var value = NSDecimal()
if scanDecimal(&value) {
return value
}
return nil
}
// MARK: Hex Numbers
/// Returns a Double if scanned in hexadecimal, or `nil` if not found.
func scanHexDouble() -> Double? {
var value = 0.0
if scanHexDouble(&value) {
return value
}
return nil
}
/// Returns a Float if scanned in hexadecimal, or `nil` if not found.
func scanHexFloat() -> Float? {
var value: Float = 0.0
if scanHexFloat(&value) {
return value
}
return nil
}
/// Returns a UInt32 if scanned in hexadecimal, or `nil` if not found.
func scanHexInt() -> UInt32? {
var value: UInt32 = 0
if scanHexInt(&value) {
return value
}
return nil
}
/// Returns a UInt64 if scanned in hexadecimal, or `nil` if not found.
func scanHexLongLong() -> UInt64? {
var value: UInt64 = 0
if scanHexLongLong(&value) {
return value
}
return nil
}
}