SwiftScanner
SwiftScanner
是一个纯 Swift 实现的字符串扫描器,无依赖项,完全支持 Unicode(谁不喜欢表情符号呢?),很多实用功能和Swift特性,StringScanner是 苹果内置的NSScanner
的良好替代品。
★★ 请为我们的GitHub仓库点星,以帮助我们! ★★
你可能也会喜欢
喜欢 SwiftRichString
吗?我还在工作于几个其他的开源库。
查看这里
- SwiftDate - iOS, macOS, tvOS 和 watchOS 的全功能日期和时区管理
- Hydra - 强效的 Promise, Async/Await 库
- SwiftLocation - CoreLocation 和信标监控库
- SwiftScanner - 支持完全 Unicode 的纯Swift字符串扫描器
- SwiftSimplify - 高性能Swift Polyline 简化库
- SwiftMsgPack - Swift中的MsgPack 编码/解码器
主要特性
SwiftScanner 使用字符串进行初始化,并维护一个内部索引,用于使用两个主要概念来回导航字符串:
scan
返回字符串并递增内部索引peek
返回字符串但不递增内部索引
这些操作的结果返回收集到的字符串或索引。如果由于错误(例如 eof
、notFound
、invalidInt
...)而失败并抛出异常,则按照纯 Swift 风格。
API 文档
- scanChar()
- scanInt()
- scanFloat()
- scanHexInt()
- scan(upTo: UnicodeScalar)
- scan(upTo: CharacterSet)
- scan(untilIn: CharacterSet)
- scan(upTo: String)
- scan(until: Test)
- scan(length: Int)
- peek(upTo: UnicodeScalar)
- peek(upTo: CharacterSet)
- peek(untilIn: CharacterSet)
- peek(upTo: String)
- peek(until: Test)
- match(UnicodeScalar)
- match(String)
- reset()
- peekAtEnd()
- skip(length: Int)
- back(length: Int)
其他
scan
函数
#### `func scanChar() throws -> UnicodeScalar` `scanChar` allows you to scan the next character after the current's scanner `position` and return it as `UnicodeScalar`. If operation succeded internal scanner's `position` is advanced by 1 character (as unicode). If operation fails an exception is thrown. Example:
let scanner = StringScanner("Hello this is SwiftScanner") let firstChar = try! scanner.scanChar() // get 'H'
Example:
let scanner = StringScanner("15 apples") let parsedInt = try! scanner.scanInt() // get Int=15
Example:
let scanner = StringScanner("45.54 $") let parsedFloat = try! scanner.scanFloat() // get Int=45.54
0x[VALUE]
(example:0x0000000000564534
)0X[VALUE]
(example:0x0929
)#[VALUE]
(example:#1602
)
If scan succeded scanner's position
is updated at the end of the represented string, otherwise an exception ((.notFound
, ).invalidHex
, .eof
) is thrown and index is not touched.
Example:
let scanner = StringScanner("#1602") let value = try! scanner.scanHexInt(.bit16) // get Int=5634 let scanner = StringScanner("#0x0929") let value = try! scanner.scanHexInt(.bit16) // get Int=2345 let scanner = StringScanner("#0x0000000000564534") let value = try! scanner.scanHexInt(.bit64) // get Int=5653812
Example:
let scanner = StringScanner("Hello <bold>Daniele</bold>") let partialString = try! scanner.scan(upTo: "<bold>") // get "Hello "
Example:
let scanner = StringScanner("Hello, I've at least 15 apples") let partialString = try! scanner.scan(upTo: CharacterSet.decimalDigits) // get "Hello, I've at least "
Example:
let scanner = StringScanner("HELLO i'm mark") let partialString = try! scanner.scan(untilIn: CharacterSet.lowercaseLetters) // get "HELLO"
Example:
let scanner = StringScanner("This is a simple test I've made") let partialString = try! scanner.scan(upTo: "I've") // get "This is a simple test "
Example:
let scanner = StringScanner("Never be satisfied 💪 and always push yourself! 😎 Do the things people say cannot be done") let delimiters = CharacterSet(charactersIn: "💪😎") while !scanner.isAtEnd { let block = scanner.scan(untilTrue: { char in return (delimiters.contains(char) == false) }) // Print: // "Never be satisfied " (first iteration) // "and always push yourself!" (second iteration) // "Do the things people say cannot be done" (third iteration) print("Block: \(block)") try scanner.skip() // push over the character }
Example:
let scanner = StringScanner("Never be satisfied") let partialString = scanner.scan(5) // "Never"
peek
函数
Peek 函数类似于 scan()
的概念,但除非它还更新内部扫描器的 position
索引。这些函数通常仅返回匹配模式的 起始索引
。
Example:
let scanner = StringScanner("Never be satisfied") let index = try! scanner.peek(upTo: "b") // return 6
Example:
let scanner = StringScanner("You are in queue: 123 is your position") let index = try! scanner.peek(upTo: CharacterSet.decimalDigits) // return 18
Example:
let scanner = StringScanner("654 apples") let index = try! scanner.peek(untilIn: CharacterSet.decimalDigits) // return 3
Example:
let scanner = StringScanner("654 apples in the bug") let index = try! scanner.peek(upTo: "in") // return 11
Example:
let scanner = StringScanner("I'm very 💪 and 😎 Go!") let delimiters = CharacterSet(charactersIn: "💪😎") while !scanner.isAtEnd { let prevIndex = scanner.position let finalIndex = scanner.peek(untilTrue: { char in return (delimiters.contains(char) == false) }) // Distance will return: // - 9 (first iteration) // - 5 (second iteration) // - 4 (third iteration) let distance = scanner.string.distance(from: prevIndex, to: finalIndex) try scanner.skip(length: distance + 1) }
其他函数
#### `func match(_ char: UnicodeScalar) -> Bool` 如果当前位置的字符与给定字符不匹配,则返回 false。如果匹配,则将扫描器的 `position` 移动到匹配的末尾。let scanner = StringScanner("💪 and 😎") let match = scanner.match("😎") // 返回 false
let scanner = StringScanner("I'm very 💪 and 😎 Go!") scanner.match("I'm very") // 返回 true
CocoaPods
use_frameworks!
pod 'SwiftScanner'
Carthage
github 'malcommac/SwiftScanner'
Swift Package Manager
在您的 Package.swift
中将 swiftline 添加为依赖
import PackageDescription
let package = Package(name: "YourPackage",
dependencies: [
.Package(url: "https://github.com/malcommac/SwiftScanner.git", majorVersion: 0),
]
)
## 测试 测试可以在这里找到:[点击这里](https://github.com/malcommac/SwiftScanner/tree/master/Tests)。使用以下命令运行它们:
swift test
## 需求 当前版本与以下系统兼容: -
Swift 4.x >= 1.0.4
-
Swift 3.x: up to 1.0.3
-
iOS 8 或更高版本
-
macOS 10.10 或更高版本
-
watchOS 2.0 或更高版本
-
tvOS 9.0 或更高版本
-
...以及几乎任何与 Swift 3 兼容且实现了 Swift Foundation 库的平台
作为开源创建,任何帮助都受到欢迎!
该库的代码采用 MIT 许可证;您可以在商业产品中使用它而没有任何限制。
唯一的要求是在您的“关于”或“信用”部分中添加以下文本的一行:
SwiftScanner 部分摘自古登 https://github.com/malcommac/SwiftScanner 由 Daniele Margutti 创建并采用 MIT 许可证。